本文先做知识点的简单介绍,最后附完整案例。
一、解析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>

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