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);

 七、利用XSLT转换XML

<!-- XML-->
<PHONEBOOK>
<PERSON>
 <NAME>Joe Wang</NAME>
 <EMAIL>joe@yourserver.com</EMAIL>
 <TELEPHONE>202-999-9999</TELEPHONE>
 <WEB>www.w3cschool.cn</WEB>
</PERSON>
<PERSON>
 <NAME>Karol</NAME>
 <EMAIL>karol@yourserver.com</EMAIL>
 <TELEPHONE>306-999-9999</TELEPHONE>
 <WEB>www.w3cschool.cn</WEB>
</PERSON>
<PERSON>
 <NAME>Green</NAME>
 <EMAIL>green@yourserver.com</EMAIL>
 <TELEPHONE>202-414-9999</TELEPHONE>
 <WEB>www.w3cschool.cn</WEB>
</PERSON>
</PHONEBOOK>
View Code
 1 <!-- xslt-->
 2 <?xml version="1.0" encoding="UTF-8"?>
 3 <xsl:stylesheet version="1.0"
 4     xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 5     <xsl:template match="/">
 6         <html>
 7             <head>
 8                 <title>Directory</title>
 9             </head>
10             <body>
11 
12                 <table border="1">
13 
14                     <tr>
15                         <th>Name</th>
16                         <th>Telephone</th>
17                         <th>Email</th>
18                     </tr>
19 
20                     <xsl:for-each select="PHONEBOOK/PERSON">
21                         <xsl:sort />
22                         <tr>
23                             <td>
24                                 <xsl:value-of select="NAME" />
25                             </td>
26                             <td>
27                                 <xsl:value-of select="TELEPHONE" />
28                             </td>
29                             <td>
30                                 <xsl:value-of select="EMAIL" />
31                             </td>
32                         </tr>
33                     </xsl:for-each>
34 
35                 </table>
36             </body>
37         </html>
38     </xsl:template>
39 </xsl:stylesheet>
View Code
 1 public class XSLTTest {
 2     public static void main(String[] args) {
 3          SAXReader reader = new SAXReader();
 4          try {
 5             Document document = reader.read("phonebook.xml");
 6             
 7             TransformerFactory factory = TransformerFactory.newInstance();
 8             Transformer transformer = factory.newTransformer(new StreamSource("style1.xsl"));
 9             
10             DocumentSource source = new DocumentSource(document);
11             DocumentResult result = new DocumentResult();
12             transformer.transform(source, result);            
13             Document doc = result.getDocument();
14             
15             OutputFormat format = OutputFormat.createPrettyPrint();
16             XMLWriter writer = new XMLWriter(System.out, format);
17             writer.write(doc);
18             writer.close();
19          } catch (Exception e) {
20             // TODO Auto-generated catch block
21             e.printStackTrace();
22         }
23     }
24 }

转换结果

<?xml version="1.0" encoding="UTF-8"?>

<html>
  <head>
    <title>Directory</title>
  </head>
  <body>
    <table border="1">
      <tr>
        <th>Name</th>
        <th>Telephone</th>
        <th>Email</th>
      </tr>
      <tr>
        <td>Green</td>
        <td>202-414-9999</td>
        <td>green@yourserver.com</td>
      </tr>
      <tr>
        <td>Joe Wang</td>
        <td>202-999-9999</td>
        <td>joe@yourserver.com</td>
      </tr>
      <tr>
        <td>Karol</td>
        <td>306-999-9999</td>
        <td>karol@yourserver.com</td>
      </tr>
    </table>
  </body>
</html>
View Code

 

转载于:https://www.cnblogs.com/ustc-anmin/p/10116934.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值