dom4j使用方法详解
阅读原文时间:2023年07月14日阅读:1

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

一、解析XML文件

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

二、利用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  
}  

}

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

public void bar(Document document) {
List 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;  
}  

}

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

public class Foo {

 public void write(Document document) throws IOException {

     // 保存至output.xml  
     try (FileWriter fileWiter = new FileWriter("output.xml")) {  
         XMLWriter writer = new XMLWriter(fileWriter);  
         writer.write( document );  
         writer.close();  
     }

     // 以格式化的形式保存 有缩进...  
     OutputFormat format = OutputFormat.createPrettyPrint();  
     writer = new XMLWriter(System.out, format);  
     writer.write( document );  
 }  

}

tips:

  • 将字符串转化为XML文档

    String text = " James ";
    Document document = DocumentHelper.parseText(text);

    七、利用XSLT转换XML


Joe Wang joe@yourserver.com 202-999-9999 www.w3cschool.cn Karol karol@yourserver.com 306-999-9999 www.w3cschool.cn Green green@yourserver.com 202-414-9999 www.w3cschool.cn






Directory

             <table border="1">

                 <tr>  
                     <th>Name</th>  
                     <th>Telephone</th>  
                     <th>Email</th>  
                 </tr>

                 <xsl:for-each select="PHONEBOOK/PERSON">  
                     <xsl:sort />  
                     <tr>  
                         <td>  
                             <xsl:value-of select="NAME" />  
                         </td>  
                         <td>  
                             <xsl:value-of select="TELEPHONE" />  
                         </td>  
                         <td>  
                             <xsl:value-of select="EMAIL" />  
                         </td>  
                     </tr>  
                 </xsl:for-each>

             </table>  
         </body>  
     </html>  
 </xsl:template>  

public class XSLTTest {
public static void main(String[] args) {
SAXReader reader = new SAXReader();
try {
Document document = reader.read("phonebook.xml");

         TransformerFactory factory = TransformerFactory.newInstance();  
         Transformer transformer = factory.newTransformer(new StreamSource("style1.xsl"));

         DocumentSource source = new DocumentSource(document);  
         DocumentResult result = new DocumentResult();  
         transformer.transform(source, result);  
         Document doc = result.getDocument();

         OutputFormat format = OutputFormat.createPrettyPrint();  
         XMLWriter writer = new XMLWriter(System.out, format);  
         writer.write(doc);  
         writer.close();  
      } catch (Exception e) {  
         // TODO Auto-generated catch block  
         e.printStackTrace();  
     }  
 }  

}

转换结果

Directory

Name Telephone Email
Green 202-414-9999 green@yourserver.com
Joe Wang 202-999-9999 joe@yourserver.com
Karol 306-999-9999 karol@yourserver.com

手机扫一扫

移动阅读更方便

阿里云服务器
腾讯云服务器
七牛云服务器

你可能感兴趣的文章