千家信息网

在c#中如何使用Xpath

发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,小编给大家分享一下在c#中如何使用Xpath,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!在c#中,我们经常查找,遍历节点
千家信息网最后更新 2026年11月02日在c#中如何使用Xpath

小编给大家分享一下在c#中如何使用Xpath,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

在c#中,我们经常查找,遍历节点,这是我们可以用到XPath语法,XPath语法很简单,但是强大够用,XPath可以快速定位到Xml中的节点或者属性,它也是使用xslt的基础知识

示例Xml:

      100  this is a black cat      80  this is a white cat      80  this is a yellow cat            100  this is a black dog      80  this is a white dog      80  this is a yellow dog    

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。

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Xml.XPath;using System.Xml; namespace UseXPathDotNet{class Program{static void Main(string[] args){UseXPathWithXPathDocument(); UseXPathWithXmlDocument(); Console.Read();} static void UseXPathWithXmlDocument(){XmlDocument doc = new XmlDocument();doc.Load("http://www.cnblogs.com/yukaizhao/rss");//使用xPath选择需要的节点XmlNodeList nodes = doc.SelectNodes("/rss/channel/item[position()<=10]");foreach (XmlNode item in nodes){string title = item.SelectSingleNode("title").InnerText;string url = item.SelectSingleNode("link").InnerText;Console.WriteLine("{0} = {1}", title, url);}} static void UseXPathWithXPathDocument(){XPathDocument doc = new XPathDocument("http://www.cnblogs.com/yukaizhao/rss");XPathNavigator xPathNav = doc.CreateNavigator();//使用xPath取rss中最新的10条随笔XPathNodeIterator nodeIterator = xPathNav.Select("/rss/channel/item[position()<=10]");while (nodeIterator.MoveNext()){XPathNavigator itemNav = nodeIterator.Current;string title = itemNav.SelectSingleNode("title").Value;string url = itemNav.SelectSingleNode("link").Value;Console.WriteLine("{0} = {1}",title,url);} }}}

XPath使用示例,请看下面的代码注释 

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.IO;using System.Xml; namespace UseXPath2{class Program{static void Main(string[] args){string xml = @"100this is a black cat80this is a white cat110this is a yellow cat  114this is a black dog80this is a white dog80this is a yellow dog 8000this is a white pig"; using (StringReader rdr = new StringReader(xml)){XmlDocument doc = new XmlDocument();doc.Load(rdr); //取所有pets节点下的dog字节点XmlNodeList nodeListAllDog = doc.SelectNodes("/pets/dog"); //所有的price节点XmlNodeList allPriceNodes = doc.SelectNodes("//price"); //取最后一个price节点XmlNode lastPriceNode = doc.SelectSingleNode("//price[last()]"); //用双点号取price节点的父节点XmlNode lastPriceParentNode = lastPriceNode.SelectSingleNode(".."); //选择weight*count=40的所有动物,使用通配符*XmlNodeList nodeList = doc.SelectNodes("/pets/*[@weight*@count=40]"); //选择除了pig之外的所有动物,使用name()函数返回节点名字XmlNodeList animalsExceptPigNodes = doc.SelectNodes("/pets/*[name() != 'pig']");  //选择价格大于100而不是pig的动物XmlNodeList priceGreaterThan100s = doc.SelectNodes("/pets/*[price p @weight >10 and name() != 'pig']");foreach (XmlNode item in priceGreaterThan100s){Console.WriteLine(item.OuterXml);} //选择第二个dog节点XmlNode theSecondDogNode = doc.SelectSingleNode("//dog[position() = 2]"); //使用xpath ,axes 的 parent 取父节点XmlNode parentNode = theSecondDogNode.SelectSingleNode("parent::*"); //使用xPath选择第二个dog节点前面的所有dog节点XmlNodeList dogPresibling = theSecondDogNode.SelectNodes("preceding::dog"); //取文档的所有子孙节点priceXmlNodeList childrenNodes = doc.SelectNodes("descendant::price");} Console.Read();}}}

以上是"在c#中如何使用Xpath"这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!

节点 选择 属性 函数 名字 示例 c# 文档 语法 子孙 关键 关键字 动物 字节 数字 条件 篇文章 运算 之间 代码 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 百单网互联网科技有限公司怎么样 互联网与科技发展 深圳互联网科技公司 亿账通互联网科技 唐信互联网科技 大连 互联网科技有限公司 翻译 互联网科技公司的市场部门 宁波青枫互联网科技有限公司 欧洲十大科技互联网公司 互联网科技项目计划书材料类 受益于互联网科技的高速发展 新兴科技互联网创新大赛颁奖典礼 高科技互联网发展前景如何 互联网数据科技专业 上海京穆互联网科技有限公司 广西科技产业互联网是什么 互联网科技新闻 科技信息时代互联网发展 北京军民互联网科技公司 山东亿川互联网科技有限责任公司 广州紫鲸互联网科技有限公司 新华互联网科技学校 互联网科技垄断 银优互联网科技有限公司 腾讯科技 互联网女皇 猫创互联网科技 互联网科技公司招聘 湖南诚度互联网科技有限公司 徐州市互联网科技有限公司 盐城市攀科互联网科技有限公司
0