XPath は、Xml 内のノードまたは属性をすばやく見つけることができます。 XPath 構文はシンプルですが、十分強力です。xslt を使用するための基礎知識でもあります。
例
| 例
| 説明例
|
/
|
は、ルートノードから開始して |
/pets |
ルートノードを選択することを意味しますペット |
は、ノードと子ノードの間のスペーサーを表します |
/pets/dog |
ペット犬ノードを選択してくださいノードの下の |
||||
//xx |
は、現在のノードの位置に関係なくxmlドキュメント全体から検索することを意味します |
/ /price |
すべてのpriceノード |
|||
を選択します。 |
シングル英語の半角ピリオドは現在のノードの選択を示します |
/pets/. |
ペットノード |
|||
.. |
二重点は親ノードの選択を示します |
/pets/dog[0]/.. |
は、最初のdogノード |
|||
@xx の親ノードである petsノードを表します。 | は属性を選択することを意味します |
//dog/@color |
はすべてを選択することを意味しますgノードカラー属性コレクション |
|||
[…] |
角括弧は選択条件を示し、括弧内は条件を示します |
// Dog[@color ='white'] |
すべてのcolorはwhiteのdogノード |
|||
//犬[/価格 |
すべてのdogノード |
|||||
は、 c#や他の言語と同様のノードインデックスです。 、配列の添字は1から始まります | //犬[1]
|
ノード1 最後のdog は |
||||
|
|
|
単一の垂直バーは、マージされたノードの組み合わせを表します |
//dog[@color='white'] //cat[@color='white'] | |
colorwhite属性を持つdogノードとcatノード |
||
|
|
//dog/* |
は、dogノードのすべての子ノードを表します
|
|||
// Dog /@* |
は、dogノードのすべての属性ノードを表します |
2.
pは除算を意味し、数学的な除算記号 / ここではノード間の区切り記号として使用されています
modは剰余を取ることを意味します
3. XPath 論理演算子
=
等しい、C# の ==!=
は
はより大きい
>=はより大きい
<は
より小さい は and以下 そして、関係
oror or 関係
4. XPath 軸
直訳すると XPath 軸を意味しますが、私の理解によれば、これは XPath ノード リレーショナル操作キーワードに翻訳されます。これは、関連するノードまたはノードのグループを示す一連のキーワードに ::二重コロンを加えたものです。構文を使用します: axisname::nodetest[predicate]、つまり、axis name::node name[ノード条件を取得]
具体的な手順は次のとおりです:キーワード
説明 |
例 |
説明例 |
先祖 |
現在のノードの親ノード |
ancestor::pig |
ances現在のノード pignode の Tor |
ancestor-or-self |
現在のノードとその親ノード |
先祖::豚 |
|
|||
属性 |
現在のノードのすべての属性 |
attribute::weight |
は次と同等です @weight、属性::、および@ は、現在のノードの |
|||
child |
と同等です |
子: :*[名前()!='価格']
|
名前が price |
|||
descendant |
子孫ノード |
descendant::*[@*] |
属性を持つ子孫ノード |
|||
子孫 - または - 自分自身
|
子孫ノードと現在のノード |
子孫または自分自身::* |
|
|||
フォロー中 |
Xml現在のノードの後 |
のすべてのノード:* |
| |||
次の兄弟
|
現在のノードと同じ父親と弟のノード |
次の兄弟:: |
前 |
|||
|
|
|
名前空間 |
|||
|
名前空間::* |
|
||||
|
親::
| ポイント2倍相当..
|
先行兄弟 |
現在のノードの後の同じ父ノードと兄弟ノード |
preceding-sibling::* |
|
自分 |
現在のノード |
自分::*
|
アラカルトに相当します。 |
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(); } } }
以上がXPath 構文: C# で XPath の例を使用するための具体的なコードの紹介の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。