解析XML文件的主流技術包括:DOM、JDOM、SAX和DOM4J;
DOM4J是一個十分優秀的開源框架(易用、開源)。使用比較廣泛, SUN的JAXM也在用DOM4J, Hibernate用它來讀寫配置文件等。它應用於Java平臺,採用了Java集合框架並完全支持DOM,SAX和JAXP。DOM4J的使用非常簡單,在使用的過程中,只需要通過查詢幫助文檔和相關的技術博客即可完成常規的操作。【當XML文檔較大且不考慮平臺移植性時,建議採用DOM4J】
這裏簡單介紹DOM4J對XML文件內容的解析和對XPath的支持。
1、迭代方式解析XML文件內容及標籤屬性
private static void readNodes(Element node){
//首先獲取當前節點的所有屬性
List<Attribute> list = node.attributes();
//遍歷節點屬性
for(Attribute attribute : list){
System.out.print("\n");
System.out.println("屬性-"+attribute.getName() +":" + attribute.getValue());
}
//輸出當前節點下的內容
if(!(node.getTextTrim().equals(""))){
System.out.println( node.getName() + ":" + node.getText());
}
//迭代當前節點下面的所有子節點
Iterator<Element> iterator = node.elementIterator();
while(iterator.hasNext()){
Element e = iterator.next();
readNodes(e);
}
}
2、對XPath的支持,直接讀取指定標籤下的值(name和age)需要引入jaxen-xx-xx.jar,否則會報java.lang.NoClassDefFoundError: org/jaxen/JaxenException異常
private static void readNodesByXPath(Document document){
List list = document.selectNodes("/students/student/name");
for (int i = 0; i < list.size(); i++) {
Element node = (Element) list.get(i);
System.out.println(node.getName()+"-"+node.getTextTrim());
}
System.out.println("----------------------------------------");
List list2 = document.selectNodes("/students/student/age");
for (int i = 0; i < list2.size(); i++) {
Element node = (Element) list2.get(i);
System.out.println(node.getName()+"-"+node.getTextTrim());
}
}
3、項目中有時會遇到一種情況,要求請求的入參(XML)格式比複雜,但有效的參數就幾個( 首先編輯好XML待用,然後讀取並添加有效參數即可,接下來以student.xml爲例,添加參數)
private static void addAndUpdateXml(Document document) {
//XPath查找param1和param2節點
Node node = document.selectSingleNode("/students/student/param1");
node.setText("1");
Node node2 = document.selectSingleNode("/students/student/param2");
node2.setText("2");
System.out.println(document.asXML());
}
4、代碼調用測試方法
讀寫XML文檔主要依賴於org.dom4j.io包,其中提供了DOMReader和SAXReader兩類不同方式。因爲利用了相同的接口,所以他們的調用方式是相同的。
public static void main(String[] args) throws Exception {
ReadXml();
}
public static void ReadXml() throws Exception{
//1.創建SAXReader對象
SAXReader reader = new SAXReader();
//2.讀取文件
InputStream ins = Thread.currentThread().getContextClassLoader().getResourceAsStream("students.xml");
if(ins == null){
throw new Exception("獲取文件失敗或文件不存在!");
}
Document document = reader.read(ins);
//3.獲取根節點元素對象
Element root = document.getRootElement();
//解析 - 遍歷
readNodes(root);
//解析 - XPath讀取指定標籤下的值
readNodesByXPath(document);
//讀取xml文件,添加和更改數值
addAndUpdateXml(document);
}
分析:代碼片段中爲讀取項目源文件路徑下的students.xml文件;SAXReader的read方法是重載的,可以從InputStream, File, Url等多種不同的源讀取,得到的Document對象就代表了整個XML。一切XML解析都是從Root元素開始的,所以首先通過Document獲取Root
5、student.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<students>
<student id='0001'>
<name>stu01</name>
<age>20</age>
<sex>男</sex>
<param1></param1>
</student>
<student id='0002'>
<name>stu02</name>
<age>22</age>
<sex>女</sex>
<param2></param2>
</student>
</students>