1. 程式人生 > >使用 dom4j 處理 xml (下)

使用 dom4j 處理 xml (下)

記錄一些 xpath 的常規用法,備忘。

 1 //3、XPath 瞭解(用於在xml中選取元素,類似 jquery 選擇器)
 2                 //3.1  路徑
 3                 Node node1 = root.selectSingleNode("/person"); 
 4                 System.out.println(node1.asXML());
 5                 
 6                 //3.2  “@” 選取節點屬性(取屬性一般用selectSingleNode)
 7                 Node node4 = root.selectSingleNode("//person").selectSingleNode("@name");
8 System.out.println(node4.asXML()); 9 10 //3.3 “[]” 既可以用作過濾,也可以作下標使用 11 List<Node> nodes1 = root.selectNodes("//person[@cls!='04']"); //從當前路徑找node名為person並且cls屬性值不是04的節點 12 for(Node tmpNode : nodes1) 13 { 14
System.out.println(tmpNode.asXML()); 15 } 16           //3.4 小結: 17        -------- 路徑 ------------------- 18 // "//person" “//”表示從當前節點的位置開始(忽略中間路徑),去找後代節點中有無person節點 19 // "//persons//a" 兩個
// 20 // "../.." 父節點的父節點 21 // "/person" 從根節點開始找(不忽略中間路徑,要一級一級往下找)。。不僅找不到,還影響後續程式碼的執行。 22 --------- 過濾 和 運算子 ------ 23 // "//person[a]" //從當前路徑找, node名為person,並且 含有a子節點 24 // "//person[@id]" //從當前路徑找 , node名為person, 並且有id屬性 25 // "//person[@age>=24]" = != > >= < <= (但是不支援*=、$=、^=、~=等) 26 // "//person[@age>=24 and @age<30]" 與 27 // "//person[@age>=24][@age<30]" 作用同上 28 // "//person[@age>26 or @age<20]" 或 29 // "//person[not(@age<25)]" 非 30 // "//persons/dog | //persons/person" 返回兩個list的並集("//persons/dog and //persons/person"達不到這樣的效果) 31       ---------- 下標 ------------ 32             // "//person[2]" 取匹配節點中的第2個節點(下標從1開始) 33             // "//person[last()-1]" 取倒數第二個 34 35       ----------- 萬用字元 ----------- 36             // "//person/@name" 匹配所有person節點的name 37             // "//persons/person" 匹配persons下的所有person子節點 38             // "//persons/*" 萬用字元,匹配persons下的所有子節點 ----------- 函式 ----------------- 39             // "/node()" 匹配根節點下的所有節點(包含文字節點和註釋節點)(要注意與"/*"區別) 40             // "//dog/text()" 匹配dog節點下的文字 41             // "//child::node()" 從當前位置開始,遞迴所有後代節點(包含文字節點和註釋節點) 42             // "//child::*" 從當前位置開始,遞迴所有後代節點 43 44       ----------- 有名稱空間的 ---------------      45             // "//namespace::*" 輸出所有的namespace,有重複! 46             // "//*[local-name()='person']" 匹配local-name 為person 的節點,如 ??:person 47             // "//mt:person" 帶上名稱空間就好了 48             // "/cumt:classes/mc:persons/mt:person"

 

note: 後代節點和子節點 不是一回事,後代節點還包括子節點的子節點的……