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