Java解析XML之dom4j方式

来源:互联网 发布:校园网网络设计方案 编辑:程序博客网 时间:2024/05/02 13:13
      DOM4J是dom4j.org出品的一个开源XML解析包。Dom4j是一个易用的、开源的库,用于XML,XPath和XSLT。它应用于Java平台,采用了Java集合框架并完全支持DOM,SAX和JAXP。
      需要的jar包:dom4j-1.6.1.jar、jaxen-1.1-beta-6.jar。

示例:
default.xml
<?xml version="1.0" encoding="UTF-8"?><groups><stu id="001"><name>zero001</name><email>123@161.com</email></stu><stu id="002"><name>zero002</name><email>123@162.com</email></stu></groups>
Dom4jRead.java
import java.io.File;import java.util.Iterator;import java.util.List;import org.dom4j.*;import org.dom4j.io.SAXReader;public class Dom4jRead {public static void main(String[] args) throws DocumentException {SAXReader reader = new SAXReader();Document document = reader.read(new File("default.xml"));Element rootElement = document.getRootElement();// 根节点System.out.println("根节点: " + rootElement.getName());// 枚举所有子节点for (Iterator it = rootElement.elementIterator(); it.hasNext();) {Element element = (Element) it.next();System.out.println(element.getName());}// 枚举名称为xxx的节点的子节点for (Iterator it = rootElement.element("stu").elementIterator(); it.hasNext();) {Element element = (Element) it.next();System.out.print(element.getName() + ": ");System.out.println(element.getText());System.out.println(element.getStringValue());}// 枚举属性for (Iterator it = rootElement.element("stu").attributeIterator(); it.hasNext();) {Attribute attribute = (Attribute) it.next();System.out.println(attribute.getName() + "=" + attribute.getValue());}// rootElement.element("stu"), 取第一个stu// List list = rootElement.elements("stu"); 取所有stu}}
Dom4jWrite.java
import java.io.FileOutputStream;import java.io.FileWriter;import java.io.IOException;import org.dom4j.*;import org.dom4j.io.OutputFormat;import org.dom4j.io.XMLWriter;public class Dom4jWrite {public static void main(String[] args) {Document document = DocumentHelper.createDocument();Element root = document.addElement("groups");Element stuElement = root.addElement("stu");Element nameElement = stuElement.addElement("name");Element ageElement = stuElement.addElement("age");nameElement.addAttribute("id", "1").setText("萧");ageElement.setText("18");Element stu = DocumentHelper.createElement("stu");stu.add(DocumentHelper.createElement("name"));stu.add(DocumentHelper.createElement("age"));document.getRootElement().add(stu);// 删除// stu.getParent().remove(stu);try {// FileWriter out = new FileWriter("my.xml");// document.write(out);// out.flush();// out.close();// 格式美化OutputFormat format = OutputFormat.createPrettyPrint();format.setEncoding("UTF-8");// XMLWriter writer = new XMLWriter(new FileWriter("out.xml"),// format);XMLWriter writer = new XMLWriter(new FileOutputStream("out.xml"),format);writer.write(document);writer.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}
运行结果:out.xml
<?xml version="1.0" encoding="UTF-8"?><groups>  <stu>    <name id="1">萧</name>    <age>18</age>  </stu>  <stu>    <name/>    <age/>  </stu></groups>

      采用dom4j的方式读取xml文件,不能越层访问,而与xpath配合使用就可以很方便的越层访问。
简单示例:
xpath.xml
<?xml version="1.0" encoding="UTF-8"?><AAA><BBB id="b1"><CCC><DDD>d</DDD></CCC></BBB><BBB id="b2" /><BBB><DDD>d</DDD></BBB><BBB name="bbb" /></AAA>
Dom4jXpath.xml
import java.io.File;import java.util.List;import org.dom4j.Document;import org.dom4j.Element;import org.dom4j.io.SAXReader;public class Dom4jXpath {// dom4j 配合 xpathpublic static void main(String[] args) throws Exception {// TODO Auto-generated method stubSAXReader reader = new SAXReader();Document document = reader.read(new File("xpath.xml"));List eList = document.selectNodes("/AAA");System.out.println(eList.size());// 1eList = document.selectNodes("/AAA/BBB");System.out.println(eList.size());// 4eList = document.selectNodes("/AAA/CCC");System.out.println(eList.size());// 0eList = document.selectNodes("//DDD");// 不管层级关系,直接取得DDD节点System.out.println(eList.size());// 2// document.selectNodes("/AAA/BBB/*"); AAA/BBB/下的所有节点// document.selectNodes("/*/*/CCC"); 有两个父节点的CCC节点// /AAA/BBB[1],/AAA/BBB[last()]}}



0 0