前面的話
本文主要講解有關Dom4j技術和xpath配合下的優化!
目錄:
為什么需要Dom4J
DOM4J怎么用
xpath怎么配合DOM4J
一 為什么需要Dom4J
一門技術出現必定是有原因的,一來是解決某方面技術問題,再者可能是優化性能。
xmlDom 簡單方便,可以將xml文檔以"DOM樹"的形式裝進內存,節點對象操作元素。但xml數據量較大時,消耗內存也大。sax訪問元素方便,不能對元素crud。都是有明顯缺點的。
Dom4j的出現,正好優化了xml解析。
Dom4j和xmlDom 從操作上看很相似,可以說只是對應的API不一樣。
值得注意的是:
DOM4J不是sun公司自己的產品,所以沒有提供服務的jar包,我們可以自己下載DOM4J-API包,里面有API(index-html),jar包等。
二 DOM4J怎么用
准備好示例xml
1 <?xml version="1.0" encoding="UTF-8"?>
2
3 <class>
4 <stu id="SP001">
5 <name>小劉</name>
6 <age>12</age>
7 <Math>100</Math>
8 <English>90</English>
9 </stu>
10 <stu id="sp002">
11 <name>小明</name>
12 <age>12</age>
13 <Math>98</Math>
14 <English>90</English>
15 </stu>
16 <stu id="sp003">
17 <name>小張</name>
18 <age>12</age>
19 <Math>83</Math>
20 <English>91</English>
21 </stu>
22 </class>
(1)訪問元素
Element e= document.getRootElement().Element('stu'); Element nameNode= (Element) e.elements("name").get(0); //等價於e.Element('name'); System.out.println( nameNode.getText());//小明
(2)插入元素
Element stuEle=DocumentHelper.createElement("stu"); stuEle.addAttribute("id", "sp003"); //添加屬性(id) Element nameEle=DocumentHelper.createElement("name"); nameEle.setText("宋江"); Element ageEle=DocumentHelper.createElement("age"); ageEle.setText("11"); Element MathEle=DocumentHelper.createElement("Math"); MathEle.setText("100"); //將元素掛到stu上 stuEle.add(nameEle); stuEle.add(ageEle); stuEle.add(MathEle);
//刷新,這很重要。
(3)修改
(4)刪除
FIND:訪問屬性時: node.Elements('NodeName'); 里面的元素只能是node的直接子節點,不可以是孫子(包括以后)。也不能根據id,name屬性來訪問元素。
那么為提高查詢效率,需要借助xpath;
三:xpath怎么配合DOM4J
(1)什么是xpath
xpath操作xml有點像sql語言查詢數據庫的效果,簡單的說,xpath是一種查詢格式。
示例xml
<?xml version="1.0" encoding="UTF-8"?> <AAA> <BBB id="sp001">B1</BBB> <BBB id="sp002" name="Bbb"> <CCC>C1</CCC> <AAA> <BBB>B2</BBB> </AAA> <BBB>B3</BBB> </BBB> </AAA>
看下面xpath配合DOM4j------注意xpath不單獨使用
List list=doc.selectNodes("/AAA/BBB"); // "/AAA/BBB"就是xpath格式 System.out.println(list.size()); //2; //(1)xpath最經典的用法一 Element list1= (Element)doc.selectSingleNode("/AAA/BBB[1]"); // 拿到屬性和Text System.out.println("id||"+list1.attributeValue("id")); System.out.println("TextContent||"+list1.getText()); // (2)經典用法二 //通過id,name屬性選出元素,相等於getElementById("ID");getElementsByTagName() //取出id=‘sp001’的BBB元素; Element node= (Element)(doc.selectNodes("//BBB[@id='sp001']").get(0)); System.out.println(node.getText()); //B1; //取出name屬性為"Bbb"的BBB元素 Element n= (Element) doc.selectSingleNode("//BBB[@name='Bbb'][1]"); System.out.println(n.attributeCount()); //2
xpath細節:
(1) "/AAA/BBB"-----AAA下的BBB集合(只是子節點), /有點路徑的意思。
再者:"/AAA/BBB[1]"----就是具體指第1個BBB元素(這里的1不是index=0開始的,就是實際上的1).
(2) "//AAA"-----指的是xml中全部AAA元素;
比如:"//AAA/BBB"---父元素是AAA的全部BBB元素集合(List)
(3) "//BBB[@id='sp001']"-----取出id=‘sp001’的BBB元素集合(List)
"//BBB[@name="Bbb"]"-----取出name="Bbb"的元素集合(List)
"//BBB[@id='sp001'][1]''----取出第1個元素
find: 通過xpath的修飾,DOM4J的查詢功能就很強大了。適用於大多數情況,一般解析xml文檔都是使用它。