dom4j是一个非常简单的开源项目。该类库底层主要借助了Java集合框架,完美地支持对XML,XPath和XSLT的操作!
xml示例:
<?xml version="1.0" encoding="gbk"?>
<games>
<game ID="1">
<name>极品飞车OL</name>
<type>网络游戏</type>
<score>85</score>
</game>
<game ID="2">
<name>仙剑奇侠传5</name>
<type>单机游戏</type>
<score>90</score>
</game>
<game ID="3">
<name>地下城与勇士</name>
<type>网络游戏</type>
<score>75</score>
</game>
</games>
一、读取
SAXReader reader = new SAXReader();
File file = new File("d:\\games.xml");
Document doc = reader.read(file);
SAXReader支持多种对象的读取,包括File,Reader,InputStream,URL,InputSource。
二、查找节点
1、通过id查找节点:
Node node = doc.elementByID("2");
// <game ID="2"><name>仙剑奇侠传5</name><type>单机游戏</type></game>
System.out.println(node.asXML());
2、通过XPath查找节点
Node node = doc.selectSingleNode("/games/game[1]/name"); // game[1]获取的是第1个节点
System.out.println(node.getText()); // 极品飞车OL
List nodeList = doc.selectNodes("/games/game[score>80]/name"); // 所有分数大于80分的游戏节点下的name节点
// 极品飞车OL 仙剑奇侠传5
for(int i = 0; i < nodeList.size(); i++) {
Node node = (Node)nodeList.get(i);
System.out.println(node.getText());
}
3、获取父节点
Node node = doc.elementByID("1");
System.out.println(node.getParent().getName());
三、移除
1、移除节点
Element element = doc.elementByID("1");
Node typeNode = element.selectSingleNode("type");
element.remove(typeNode);
// <game ID="1"><name>极品飞车OL</name><score>85</score></game>
System.out.println(element.asXML());
2、移除属性
Element element = doc.elementByID("1");
System.out.println(element.attributeValue("ID")); // 1
System.out.println(element.remove(element.attribute("ID"))); // true 移除成功 false 移除失败
System.out.println(element.attributeValue("ID")); // null
四、添加与设置
由于添加(add)和设置(set)方法与第三点移除类似。请稳步直接看API。
五、输出xml
OutputFormat format = new OutputFormat();
format.setEncoding("gbk"); // 设置xml文档头编码 <?xml version="1.0" encoding="gbk"?>
XMLWriter writer = new XMLWriter(new FileWriter(new File("d:\\games2.xml")), format);
// write方法可接受Node、Element、Document、Attribute等对象
writer.write(doc);
writer.close(); // 必须close才会生成文件
六、CDATA
Element element = new BaseElement("game");
element.add(DocumentHelper.createCDATA("战神")); // 添加 CDATA数据
System.out.println(element.asXML());
element.setText(element.getText()); // 清除 CDATA标志
System.out.println(element.asXML());
参考:
dom4j apiXPath 教程