在C#中怎么使用XPath
这篇文章给大家分享的是有关在C#中怎么使用XPath的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。
XPath可以快速定位到Xml中的节点或者属性。XPath语法很简单,但是强大够用,它也是使用xslt的基础知识。
示例Xml:
<?xmlversion="1.0"encoding="utf-8"?> <pets> <catcolor="black"weight="10"> <price>100</price> <desc>thisisablackcat</desc> </cat> <catcolor="white"weight="9"> <price>80</price> <desc>thisisawhitecat</desc> </cat> <catcolor="yellow"weight="15"> <price>80</price> <desc>thisisayellowcat</desc> </cat> <dogcolor="black"weight="10"> <price>100</price> <desc>thisisablackdog</desc> </dog> <dogcolor="white"weight="9"> <price>80</price> <desc>thisisawhitedog</desc> </dog> <dogcolor="yellow"weight="15"> <price>80</price> <desc>thisisayellowdog</desc> </dog> </pets>
XPath的语法:
1. XPath中的符号
符号 | 说明 | 示例 | 示例说明 |
/ | 表示从根节点开始选择 | /pets | 选择根节点pets |
表示节点和子节点之间的间隔符 | /pets/dog | 选择pets节点下的dog节点 | |
//xx | 表示从整个xml文档中查找,而不考虑当前节点位置 | //price | 选择文档中所有的price节点 |
. | 单个英文半角句点表示选择当前节点 | /pets/. | 选择pets节点 |
.. | 双点,表示选择父节点 | /pets/dog[0]/.. | 表示pets节点,也就是第一个dog节点的父节点 |
@xx | 表示选择属性 | //dog/@color | 表示选择所有dog节点的color属性集合 |
[…] | 中括号表示选择条件,括号内为条件 | //dog[@color=’white’] | 所有color为white的dog节点 |
//dog[/price<100] | 所有price字节点值小于100的dog节点 | ||
中括号内数字为节点索引,类似c#等语言中的数组,数组下标是从1开始的 | //dog[1] | 第1个dog节点 | |
//dog[last()] | 最后一个dog节点,last()是xPath内置函数 | ||
| | 单竖杠表示合并节点结合 | //dog[@color=’white’] | //cat[@color=’white’] | color属性为white的dog节点和color属性为white的cat节点 |
* | 星号表示任何名字的节点或者属性 | //dog/* | 表示dog节点的所有子节点 |
//dog/@* | 表示dog节点的所有属性节点 |
2. XPath数学运算符
+ 加号表示加
-表示数字相减
*表示乘以
p表示除以,这里数学上的除号/已经被用作节点之间分隔符了
mod表示取余
3. XPath逻辑运算符
=等于,相当于c#中的 ==
!=不等于
>大于
>=大于等于
<小于
<=小于等于
and并且 与关系
or或者 或关系
4. XPath Axes 从字面翻译这个是XPath轴的意思,但根据我的理解这个翻译成XPath节点关系运算关键字更合适,就是一组关键字加上::双冒号表示和当前节点有关系的一个或者一组节点.
使用语法: axisname::nodetest[predicate] 即轴名字::节点名字[取节点条件]
具体说明如下:
关键字 | 说明 | 示例 | 示例说明 |
ancestor | 当前节点的父祖节点 | ancestor::pig | 当前节点的祖先节点中的pig节点 |
ancestor-or-self | 当前节点以及其父祖节点 | ancestor::pig | |
attribute | 当前节点的所有属性 | attribute::weight | 相当于@weight,attribute::和@是等价的 |
child | 当前节点的所有字节点 | child::*[name()!=’price’] | 选择名字不是price的子节点 |
descendant | 子孙节点 | descendant::*[@*] | 有属性的子孙节点 |
descendant-or-self | 子孙节点以及当前节点 | descendant-or-self::* | |
following | Xml文档中当前节点之后的所有节点 | following::* | |
following-sibling | 当前节点的同父弟弟节点 | following-sibling:: | |
preceding | Xml文档中当前节点之前的所有节点 | preceding::* | |
namespace | 选取当前节点的所有命名空间节点 | namespace::* | |
parent | 当前节点的父节点 | parent:: | 相当于双点.. |
preceding-sibling | 当前节点之后的同父兄节点 | preceding-sibling::* | |
self | 当前节点 | self::* | 相当于单点. |
5. 常用的XPath函数介绍:
在XPath表达式中常用的函数有下面两个:
position()表示节点的序号例如//cat[position()=2]表示取序号为2的dog节点 last()表示取最后一个节点//cat[last()] name()表示当前节点名字/pets/*[name()!='pig']表示/pets下名字不是pig的子节点
XPath的函数还有很多,包括字符串函数,数字函数和时间函数等,具体可以参考w3的网站。
以上是XPath的语法,下面我们看下如何在.Net中使用XPath
在.Net中可以通过XPathDocument或者XmlDocument类使用XPath。XPathDocument是只读的方式定位Xml节点或者属性文本等,而XmlDocument则是可读写的。
如下代码示例展示了如何使用XPathDocument和XmlDocument。
usingSystem; usingSystem.Collections.Generic; usingSystem.Linq; usingSystem.Text; usingSystem.Xml.XPath; usingSystem.Xml; namespaceUseXPathDotNet { classProgram { staticvoidMain(string[]args) { UseXPathWithXPathDocument(); UseXPathWithXmlDocument(); Console.Read(); } staticvoidUseXPathWithXmlDocument() { XmlDocumentdoc=newXmlDocument(); doc.Load("http://www.cnblogs.com/yukaizhao/rss"); //使用xPath选择需要的节点 XmlNodeListnodes=doc.SelectNodes("/rss/channel/item[position()<=10]"); foreach(XmlNodeiteminnodes) { stringtitle=item.SelectSingleNode("title").InnerText; stringurl=item.SelectSingleNode("link").InnerText; Console.WriteLine("{0}={1}",title,url); } } staticvoidUseXPathWithXPathDocument() { XPathDocumentdoc=newXPathDocument("http://www.cnblogs.com/yukaizhao/rss"); XPathNavigatorxPathNav=doc.CreateNavigator(); //使用xPath取rss中最新的10条随笔 XPathNodeIteratornodeIterator=xPathNav.Select("/rss/channel/item[position()<=10]"); while(nodeIterator.MoveNext()) { XPathNavigatoritemNav=nodeIterator.Current; stringtitle=itemNav.SelectSingleNode("title").Value; stringurl=itemNav.SelectSingleNode("link").Value; Console.WriteLine("{0}={1}",title,url); } } } }
XPath使用示例,请看下面的代码注释
usingSystem; usingSystem.Collections.Generic; usingSystem.Linq; usingSystem.Text; usingSystem.IO; usingSystem.Xml; namespaceUseXPath2 { classProgram { staticvoidMain(string[]args) { stringxml=@"<?xmlversion=""1.0""encoding=""utf-8""?> <pets> <catcolor=""black""weight=""10""count=""4""> <price>100</price> <desc>thisisablackcat</desc> </cat> <catcolor=""white""weight=""9""count=""5""> <price>80</price> <desc>thisisawhitecat</desc> </cat> <catcolor=""yellow""weight=""15""count=""1""> <price>110</price> <desc>thisisayellowcat</desc> </cat> <dogcolor=""black""weight=""10""count=""7""> <price>114</price> <desc>thisisablackdog</desc> </dog> <dogcolor=""white""weight=""9""count=""4""> <price>80</price> <desc>thisisawhitedog</desc> </dog> <dogcolor=""yellow""weight=""15""count=""15""> <price>80</price> <desc>thisisayellowdog</desc> </dog> <pigcolor=""white""weight=""100""count=""2""> <price>8000</price> <desc>thisisawhitepig</desc> </pig> </pets>"; using(StringReaderrdr=newStringReader(xml)) { XmlDocumentdoc=newXmlDocument(); doc.Load(rdr); //取所有pets节点下的dog字节点 XmlNodeListnodeListAllDog=doc.SelectNodes("/pets/dog"); //所有的price节点 XmlNodeListallPriceNodes=doc.SelectNodes("//price"); //取最后一个price节点 XmlNodelastPriceNode=doc.SelectSingleNode("//price[last()]"); //用双点号取price节点的父节点 XmlNodelastPriceParentNode=lastPriceNode.SelectSingleNode(".."); //选择weight*count=40的所有动物,使用通配符* XmlNodeListnodeList=doc.SelectNodes("/pets/*[@weight*@count=40]"); //选择除了pig之外的所有动物,使用name()函数返回节点名字 XmlNodeListanimalsExceptPigNodes=doc.SelectNodes("/pets/*[name()!='pig']"); //选择价格大于100而不是pig的动物 XmlNodeListpriceGreaterThan100s=doc.SelectNodes("/pets/*[pricep@weight>10andname()!='pig']"); foreach(XmlNodeiteminpriceGreaterThan100s) { Console.WriteLine(item.OuterXml); } //选择第二个dog节点 XmlNodetheSecondDogNode=doc.SelectSingleNode("//dog[position()=2]"); //使用xpath,axes的parent取父节点 XmlNodeparentNode=theSecondDogNode.SelectSingleNode("parent::*"); //使用xPath选择第二个dog节点前面的所有dog节点 XmlNodeListdogPresibling=theSecondDogNode.SelectNodes("preceding::dog"); //取文档的所有子孙节点price XmlNodeListchildrenNodes=doc.SelectNodes("descendant::price"); } Console.Read(); } } }
感谢各位的阅读!关于“在C#中怎么使用XPath”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!