XPath语法及使用
XmlNode xmlnode = xmldoc.SelectSingleNode("//document/section[@id='pla-01']/data[@id='fou_scc_code']"); //查找路径//document下属性id为‘pla-01’的section下的属性id为'fou_scc_code'的data
XmlNode xmlnode = xdoc.SelectSingleNode("//Dep[@ID='C0100D0000']"); //从根目录下查找属性ID为‘C0100D0000’的Dep节点,并只查找一个
XmlNodeList list = xmlnode.SelectNodes(".//DepEmpl"); //获取当前节点下的所有DepEmpl节点
XmlNodeList list = xmlnode.SelectNodes("/bookstore/book/title | //price");//选取所有属于 bookstore 元素的 book 元素的 title 元素,以及文档中所有的 price 元素。 选取若干路径,通过在路径表达式中使用“|”运算符,您可以选取若干个路径。
XmlNodeList list = xmlnode.SelectNodes("//*|//title[@*]|/bookstore/*"); //选取文档中的所有元素;选取所有带有属性的 title 元素;选取 bookstore 元素的所有子节点
XmlNode xnode = pNode.SelectSingleNode("DepPosi/DepPosiEmpl[@ID='1002']"); //找出当前节点下的ID为‘1002’的DepPosi/DepPosiEmpl节点
XmlNodeList xn=xml.SelectNodes("//Item[contains(id,'aad')]"); //查找id包含aad的Item ,相当于like
////////////使用XPathNavigator可以对节点进行排序查询
//XPathNavigator nav = xmlNode.CreateNavigator();
////create XPathExpression
//XPathExpression exp = nav.Compile(".//DepPosiEmpl[@DepID='" + a[1] + "']|.//DepEmpl");
////对Size 列进行降序排列
/////--------------------------------------------------------
/////如要对多列进行排序,须用XPath中的concat这个函数,
/////.eg:对tile , lastname2列进行排序:
/////exp.AddSort("concat(title,','),lastname)",.........);
/////其中的,是分隔作用
/////---------------------------------------------------------
//exp.AddSort("Serial", XmlSortOrder.Descending, XmlCaseOrder.None, "", XmlDataType.Number);
////create Iterator
//XPathNodeIterator iter = nav.Select(exp);
////循环迭代对象
//while (iter.MoveNext())
//{
// iter.Current.Attributes[
// XPathNavigator copy = iter.Current.Clone();
// //write the size child node
// copy.MoveToFirstChild();
// copy.MoveToNext();
// copy.MoveToNext();
// Console.WriteLine(copy.Value);
//}
以下是其它的XPath语法
选取节点
XPath 使用路径表达式在 XML 文档中选取节点。节点是通过沿着路径或者 step 来选取的。
下面列出了最有用的路径表达式:
表达式 描述
nodename 选取此节点的所有子节点
/ 从根节点选取
// 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置
. 选取当前节点
.. 选取当前节点的父节点
@ 选取属性
实例
bookstore 选取 bookstore 元素的所有子节点
/bookstore 选取根元素 bookstore
注释:假如路径起始于正斜杠( / ),则此路径始终代表到某元素的绝对路径!
bookstore/book 选取所有属于 bookstore 的子元素的 book 元素。
//book 选取所有 book 子元素,而不管它们在文档中的位置。
bookstore//book 选择所有属于 bookstore 元素的后代的 book 元素,而不管它们位于 bookstore 之下的什么位置。
//@lang 选取所有名为 lang 的属性。
谓语(Predicates)
谓语用来查找某个特定的节点或者包含某个指定的值的节点。
谓语被嵌在方括号中。
实例
在下面的表格中,我们列出了带有谓语的一些路径表达式,以及表达式的结果:
/bookstore/book[1] 选取属于 bookstore 子元素的第一个 book 元素。
/bookstore/book[last()] 选取属于 bookstore 子元素的最后一个 book 元素。
/bookstore/book[last()-1] 选取属于 bookstore 子元素的倒数第二个 book 元素。
/bookstore/book[position()<3] 选取最前面的两个属于 bookstore 元素的子元素的 book 元素。
//title[@lang] 选取所有拥有名为 lang 的属性的 title 元素。
//title[@lang='eng'] 选取所有 title 元素,且这些元素拥有值为 eng 的 lang 属性。
/bookstore/book[price>35.00] 选取所有 bookstore 元素的 book 元素,且其中的 price 元素的值须大于 35.00。
/bookstore/book[price>35.00]/title 选取所有 bookstore 元素中的 book 元素的 title 元素,且其中的 price 元素的值须大于 35.00。
选取未知节点
XPath 通配符可用来选取未知的 XML 元素。
通配符 描述
* 匹配任何元素节点
@* 匹配任何属性节点
node() 匹配任何类型的节点
实例
在下面的表格中,我们列出了一些路径表达式,以及这些表达式的结果:
/bookstore/* 选取 bookstore 元素的所有子节点
//* 选取文档中的所有元素
//title[@*] 选取所有带有属性的 title 元素。
选取若干路径
通过在路径表达式中使用“|”运算符,您可以选取若干个路径。
实例
在下面的表格中,我们列出了一些路径表达式,以及这些表达式的结果:
//book/title | //book/price 选取所有 book 元素的 title 和 price 元素。
//title | //price 选取所有文档中的 title 和 price 元素。
/bookstore/book/title | //price 选取所有属于 bookstore 元素的 book 元素的 title 元素,以及文档中所有的 price 元素。
XPath 运算符
下面列出了可用在 XPath 表达式中的运算符:
运算符 描述 实例 返回值
| 计算两个节点集 //book | //cd 返回所有带有 book 和 ck 元素的节点集
+ 加法 6 + 4 10
- 减法 6 - 4 2
* 乘法 6 * 4 24
div 除法 8 div 4 2
= 等于 price=9.80 如果 price 是 9.80,则返回 true。如果 price 是 9.90,则返回 fasle。
!= 不等于 price!=9.80 如果 price 是 9.90,则返回 true。如果 price 是 9.80,则返回 fasle。
< 小于 price<9.80 如果 price 是 9.00,则返回 true。如果 price 是 9.90,则返回 fasle。
<= 小于或等于 price<=9.80 如果 price 是 9.00,则返回 true。如果 price 是 9.90,则返回 fasle。
> 大于 price>9.80 如果 price 是 9.90,则返回 true。如果 price 是 9.80,则返回 fasle。
>= 大于或等于 price>=9.80 如果 price 是 9.90,则返回 true。如果 price 是 9.70,则返回 fasle。
or 或 price=9.80 or price=9.70 如果 price 是 9.80,则返回 true。如果 price 是 9.50,则返回 fasle。
and 与 price>9.00 and price<9.90 如果 price 是 9.80,则返回 true。如果 price 是 8.50,则返回 fasle。
mod 计算除法的余数 5 mod 2 1
注:路径以节点的名称
注:本随笔为本人总结后发布,如果有雷同,纯属巧合
本人邮箱:freedomjim@gmail.com,如有疑问和交流欢迎发邮件过来一起讨论,一起成长,谢谢!
浙公网安备 33010602011771号