zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    socket编程中最常用的几个数据类型和转换函数
    windows下给QT可执行文件(exe)一个图标
    fseek函数与ftell函数使用例程
    LINUX C例程1:sscanf的用法
    Linux进程控制——exec函数族
    Linux查看文件编码格式及文件编码转换
    oracle易忘函数用法(1)
    Oracle VARRAY的实际应用简介
    oracle 存储过程的基本语法 及注意事项
    何将ext中的FormPanel中,所有组件都居中放置?
  • 原文地址:https://www.cnblogs.com/ustc-anmin/p/10116934.html
Copyright © 2011-2022 走看看