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