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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM