XPath can quickly locate nodes or attributes in Xml. XPath syntax is very simple, but powerful enough. It is also the basic knowledge for using xslt.
Example
| Example
| Example description
|
/
|
means starting from the root node to select |
/pets |
Select the root nodepet s |
represents the spacer between the node and the child node |
/pets/dog |
Select pets dognode under node |
||||
//xx |
means searching from the entire xml document regardless of the current node position
|
//price |
Select all pricenodes |
|||
. |
A single English half-width period indicates selecting the current node |
/pets/. |
Select petsNode |
|||
.. |
Double dots indicate selecting the parent node |
/pets/dog[0]/.. |
represents the pets node, which is the parent node of the first dog node |
|||
@xx |
means selecting attributes |
//dog/@color |
means selecting all dog nodes colorAttribute collection
|
|||
[…] |
The square brackets represent the selection conditions, and the brackets are the conditions |
//dog[@color ='white'] |
All color are white's dognodes |
|||
//dog[/price<100 ] | All dognodes | |||||
and other languages The array , array subscript starts from 1
| Node 1 The lastdog is the | |||||
|
| The single vertical bar represents the combination of merged nodes | //dog[@color='white'] | //cat[@color='white'] | colorThe dog node with the white attribute and the catnode | |||
| //dog/* | represents all child nodes of the dog node | ||||
//dog /@* | represents all attribute nodes of the dog node |
2.
pmeans Divide by, the mathematical division sign / here has been used as the separator between nodes
modmeans taking the remainder
3. XPath logical operator
=
equal to, equivalent to ==!=
in c# is not equal to
is greater than
>=is greater than or equal to
<is less than
<=is less than or equal to
andAnd with the relationship
oror or relationship
4. Appropriate, it is a set of keywords plus ::double colon to indicate a node or a group of nodes related to the current node.
Use the syntax: axisname::nodetest[predicate], that is, axis name::node name[get the node condition] The specific instructions are as follows:
Keywords
Description
|
Example
|
Example description
|
ancestor |
The parent node of the current node |
ancestor::pig |
The ancestor of the current node pignode
|
ancestor-or-self |
The current node and its parent node |
ancestor::pig |
|
|||
attribute |
All attributes of the current node |
attribute::weight |
is equivalent to @weight, attribute:: and @ are equivalent |
|||
child |
all byte points of the current node |
child: :*[name()!='price'] |
Select the child node whose name is not price |
|||
descendant |
Descendant nodes |
descendant::*[@*] |
Descendant nodes with attributes |
|||
descendant -or-self |
Descendant nodes and current node |
descendant-or-self::* |
|
|||
# |
#following |
##following
|
|
|||
|
following::* ######################## #### #######################following-sibling######################## #########目前節點的同父弟弟節點###### |
following-sibling:: |
|
|||
|
|
|
|
|||
文件中目前節點之前的所有節點
|
preceding::* |
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 UseXPath1 { class Program { static void Main(string[] args) { string xml = @"<?xml version=""1.0"" encoding=""utf-8"" ?> <pets> <cat color=""black"" weight=""10"" count=""4""> <price>100</price> <desc>this is a black cat</desc> </cat> <cat color=""white"" weight=""9"" count=""5""> <price>80</price> <desc>this is a white cat</desc> </cat> <cat color=""yellow"" weight=""15"" count=""1""> <price>110</price> <desc>this is a yellow cat</desc> </cat> <dog color=""black"" weight=""10"" count=""7""> <price>114</price> <desc>this is a black dog</desc> </dog> <dog color=""white"" weight=""9"" count=""4""> <price>80</price> <desc>this is a white dog</desc> </dog> <dog color=""yellow"" weight=""15"" count=""15""> <price>80</price> <desc>this is a yellow dog</desc> </dog> <pig color=""white"" weight=""100"" count=""2""> <price>8000</price> <desc>this is a white pig</desc> </pig> </pets>"; 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"); //取文档的所有子孙节点price XmlNodeList childrenNodes = doc.SelectNodes("descendant::price"); } Console.Read(); } } }
The above is the detailed content of XPath syntax: Specific code introduction to using XPath examples in C#. For more information, please follow other related articles on the PHP Chinese website!