使用 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: 后代节点和子节点 不是一回事,后代节点还包括子节点的子节点的……

猜你喜欢

转载自www.cnblogs.com/Home-Artchy/p/xml_dom4j_2.html