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
采用dom4j的方式读取xml文件,不能越层访问,而与xpath配合使用就可以很方便的越层访问。
简单示例:
xpath.xml
需要的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.javaimport 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.javaimport 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 block
e.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.xmlimport java.io.File;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
public class Dom4jXpath {
// dom4j 配合 xpath
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
SAXReader reader = new SAXReader();
Document document = reader.read(new File("xpath.xml"));
List eList = document.selectNodes("/AAA");
System.out.println(eList.size());// 1
eList = document.selectNodes("/AAA/BBB");
System.out.println(eList.size());// 4
eList = document.selectNodes("/AAA/CCC");
System.out.println(eList.size());// 0
eList = 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()]
}
}