dom4j使用方法详解

本文先做知识点的简单介绍,最后附完整案例。

一、解析XML文件

1 public class Foo {
2     //url为XML文档地址
3     //自己封装了一个工具类  返回解析完成的document
4     public Document parse(URL url) throws DocumentException {
5         SAXReader reader = new SAXReader();
6         Document document = reader.read(url);
7         return document;
8     }
9 }

 二、利用JAVA的iterator来导航文档(遍历文档)

public void bar(Document document) throws DocumentException {

    Element root = document.getRootElement();

    // 从根节点开始遍历
    for (Iterator<Element> it = root.elementIterator(); it.hasNext();) {
        Element element = it.next();
        // do something
    }

    // 从根节点的名为“foo”的子节点开始遍历
    for (Iterator<Element> it = root.elementIterator("foo"); it.hasNext();) {
        Element foo = it.next();
        // do something
    }

    // 遍历根节点的属性
    for (Iterator<Attribute> it = root.attributeIterator(); it.hasNext();) {
        Attribute attribute = it.next();
        // do something
    }
 }

三、在<dom4j>中,可以在Document或树中的任何节点(例如Attribute,Element)上计算XPath表达式。 这允许使用单行代码在整个文档中进行复杂导航

public void bar(Document document) {
    List<Node> list = document.selectNodes("//foo/bar");

    Node node = document.selectSingleNode("//foo/bar/author");
   
    //获取node节点的name属性值
    String name = node.valueOf("@name");
}

  例如,如果您希望在XHTML文档中找到所有超文本链接,则可以使用以下代码

public void findLinks(Document document) throws DocumentException {

    List<Node> list = document.selectNodes("//a/@href");

    for (Iterator<Node> iter = list.iterator(); iter.hasNext();) {
        Attribute attribute = (Attribute) iter.next();
        String url = attribute.getValue();
    }
}

四、如果遍历大型XML文档树,那么为了提高性能,可以使用快速循环方法,这样可以避免为每个循环创建Iterator对象的成本 

public void treeWalk(Document document) {
    treeWalk(document.getRootElement());
}

public void treeWalk(Element element) {
    for (int i = 0, size = element.nodeCount(); i < size; i++) {
        Node node = element.node(i);
        if (node instanceof Element) {
            treeWalk((Element) node);
        }
        else {
            // do something…
        }
    }
}

五、创建XML文档

public class Foo {

    public Document createDocument() {
        Document document = DocumentHelper.createDocument();
        Element root = document.addElement("root");
        //创建root的子节点  并添加相关的属性值
        Element author1 = root.addElement("author")
            .addAttribute("name", "James")
            .addAttribute("location", "UK")
            .addText("James Strachan");
        //创建root的子节点  并添加相关的属性值
        Element author2 = root.addElement("author")
            .addAttribute("name", "Bob")
            .addAttribute("location", "US")
            .addText("Bob McWhirter");

        return document;
    }
}

六、将创建好的文档保存至磁盘

 1 public class Foo {
 2 
 3     public void write(Document document) throws IOException {
 4 
 5         // 保存至output.xml
 6         try (FileWriter fileWiter = new FileWriter("output.xml")) {
 7             XMLWriter writer = new XMLWriter(fileWriter);
 8             writer.write( document );
 9             writer.close();
10         }
11 
12 
13         // 以格式化的形式保存 有缩进...
14         OutputFormat format = OutputFormat.createPrettyPrint();
15         writer = new XMLWriter(System.out, format);
16         writer.write( document );
17     }
18 }

tips:

  • 将字符串转化为XML文档
1 String text = "<person> <name>James</name> </person>";
2 Document document = DocumentHelper.parseText(text);

猜你喜欢

转载自www.cnblogs.com/ustc-anmin/p/10116934.html