使用dom4j解析XML

使用dom4j解析XML

概述

dom4j是dom4j.org出品的一个开源XML解析包。Dom4j是一个易用的、开源的库,用于XML,XPath和XSLT。它应用于Java平台,采用了Java集合框架并完全支持DOM,SAX和JAXP。

dom4j是一个非常非常优秀的Java XML API,具有性能优异、功能强大和极易使用的特点,同时它也是一个开放源代码的软件,可以在SourceForge上找到它。

对主流的Java XML API进行的性能、功能和易用性的评测,dom4j无论在那个方面都是非常出色的。如今你可以看到越来越多的Java软件都在使用dom4j来读写XML,例如Hibernate,包括sun公司自己的JAXM也用了dom4j。

使用dom4j开发,首先下载dom4j相应的jar文件:

  1. 官网下载: http://www.dom4j.org/dom4j-1.6.1/

  2. dom4j是sourceforge.net上的一个开源项目,因此可以到http://sourceforge.net/projects/dom4j下载其最新版。

dom4j主要的接口

主要接口

dom4j的API接口说明
Node它是dom4j树中所有节点的根接口
Branch它代表能包含子节点的节点,Branch接口下有两个子接口:Element和Document
Element它代表XML元素
Document它代表XML文档根
Attribute它代表XML元素的属性
DocumentType它代表XML文档里的DOCTYPE声明
ProcessingInstruction它代表XML文档里的处理指令
CharacterData它是所有文本元素的父接口,有CDATA、Text和Comment3个子接口
Entity定义 XML entity
CDATA它代表XML文档里的CDATA
Text它代表XML文档里的文本内容
Comment它代表XML文档里的注释内容

dom4j中较为重要的解析器以及一些工具类

DOMWriter

SAXWriter

XMLWriter

Writer作用是将dom4j树转换成不同前缀的树或文件。

DocumentFactory:提供一个创建一个Document对象的方法:createDocument();

DocumentHelper:该工具提供了大量静态方法用于创建XML文档各组成部分。

使用dom4j操作xml

在使用dom4j解析xml之前,先将 dom4j-1.6.1.jar 添加到项目中。

要使用dom4j解析XML文件,首先需要获取文档的根,即Document。

在dom4j中,获取Document对象的方法有:

  1. 创建Document对象

    Document document = DocumentHelper.createDocument();

    Element root = document.addElement(“students”); // 根元素节点

  2. 读取XML文件时,获取Document对象

    SAXReader reader = new SAXReader();

    Document document = reader.read(new File(“student.xml”));

  3. 字符串解析为XML时,获取Document对象

    String text = “tom“;

    Document document = DocumentHelper.parseText(text);

创建XML文档
/**
 * 创建XML文件
 * 
 * @throws IOException
 */
public void createXml() throws IOException {
    // 创建Document对象
    Document document = DocumentHelper.createDocument();
    // 根元素节点
    Element root = document.addElement("students");
    root.addComment("all students info"); // 添加注释
    Element student = root.addElement("student"); // 根元素节点添加子节点
    student.addAttribute("id", "001"); // 添加节点属性
    Element name = student.addElement("name");
    name.addText("tommy"); // 设置节点文本
    Element age = student.addElement("age");
    age.addText("18");
    // 设置XML美化格式
    OutputFormat format = OutputFormat.createPrettyPrint();
    format.setEncoding("utf-8"); // 编码字符集设置
    // xml写入器
    XMLWriter writer = new XMLWriter(new FileWriter("students.xml"), format);
    // 写操作
    writer.write(document);
    writer.flush();
    writer.close();
}

结果:

创建xml

修改XML文档
/**
 * 修改xml文件
 * 
 * @throws Exception
 */
public void modifyXml() throws Exception {
    // 创建SAXReader对象
    SAXReader reader = new SAXReader();
    Document document = reader.read(new File("students.xml"));
    /** 修改内容之一: 如果student节点中id属性的内容为001,则修改成1001。因为查找节点使用到了Xpath,所以还需要将 jaxen-1.1-beta-6.jar 包添加到项目中 */
    List list = document.selectNodes("/students/student/@id");
    Iterator it = list.iterator();
    while (it.hasNext()) {
        Attribute attr = (Attribute) it.next();
        if ("001".equals(attr.getValue()))
            attr.setValue("1001");
    }
    /**
     * 修改内容之二: name项内容若为"tommy",则改为"tom"
     */
    list = document.selectNodes("/students/student/name");
    it = list.iterator();
    while (it.hasNext()) {
        Element name = (Element) it.next();
        if ("tommy".equals(name.getText())) {
            name.setText("tom");
        }
    }
    /** 修改内容之三: 将id="1001"的学生age节点删除,再添加birth节点 */
    list = document.selectNodes("/students/student/@id");
    it = list.iterator();
    while (it.hasNext()) {
        Attribute attr = (Attribute) it.next();
        if ("1001".equals(attr.getValue())) {
            Element parent = attr.getParent();
            Iterator iterator = parent.elementIterator("age");
            if (iterator.hasNext()) {
                Element elem = (Element) iterator.next();
                parent.remove(elem);
            }
            Element birth = parent.addElement("birth");
            birth.setText("1995-01-01");
            break;
        }
    }
    /* 将document中的内容写入文件中 */
    // 设置XML美化格式
    OutputFormat format = OutputFormat.createPrettyPrint();
    format.setEncoding("utf-8"); // 编码字符集设置
    // xml写入器
    XMLWriter writer = new XMLWriter(new FileWriter("students.xml"), format);
    writer.write(document);
    writer.close();
}

结果:

修改xml

遍历XML文档
/**
 * 遍历节点
 * 
 * @throws Exception
 */
public void readXml() throws Exception {
    // 创建SAXReader对象
    SAXReader reader = new SAXReader();
    // 加载xml文件
    Document document = reader.read(new File("students.xml"));
    // 获取根元素节点
    Element root = document.getRootElement();
    // 递归遍历所有节点内容
    read(root);
}

/**
 * 读节点信息
 * 
 * @param element
 *            student节点
 */
private void read(Element element) {
    for (int i = 0, size = element.nodeCount(); i < size; i++) {
        Node node = element.node(i); // 获取元素的子节点
        if (node instanceof Comment) // 注释节点
            continue;
        if (node instanceof Element) { // 元素节点
            Element elem = (Element) node;
            System.out.print(elem.getName() + " : ");
            if ("student".equals(node.getName())) { // 是student节点
                System.out.println();
                Iterator attr = elem.attributes().iterator(); // student节点属性
                while (attr.hasNext()) {
                    Attribute at = (Attribute) attr.next();
                    System.out
                            .println(at.getName() + " : " + at.getValue());
                }
            }
            read((Element) node);
        } else if (node instanceof Text) { // 文本节点
            if (!"".equals(node.getText().trim()))
                System.out.println(node.getText());
        }
    }
}

结果:

遍历xml

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值