再版: http://www.php.cn/
C# では、XPath 構文をよく使用しますが、これは非常に強力です。 XPath は、Xml 内のノードや属性を素早く見つけることができます。また、xslt の使用に関する基本的な知識でもあります
symbol
例
例の説明
|
/ |
は、ルートノードから開始することを意味します | /petsの選択を開始します ルートノードペットを選択してください |
|||||||||||||||||||||||||||||||||||||||||||||||||
はノードと子ノードの間のスペーサーを表します | /pets/dogペットノードの下の犬ノードを選択します | //xx |
||||||||||||||||||||||||||||||||||||||||||||||||||
という意味です現在のノードの位置に関係なく、XML ドキュメント全体から検索します | //price | ドキュメント内のすべての価格ノードを選択します | ||||||||||||||||||||||||||||||||||||||||||||||||||
. |
単一の英語の半角ピリオドは現在のノードの選択を示します | /pets/. | ペットノードの選択 | |||||||||||||||||||||||||||||||||||||||||||||||||
... |
ダブルポイント、親ノードの選択を示します | / ets/dog[0]/.. | は、最初の犬ノードの親ノードであるペットノードを示します | |||||||||||||||||||||||||||||||||||||||||||||||||
@xx |
選択属性を表します | //dog/@color | すべての犬ノードのカラー属性セットの選択を表します | |||||||||||||||||||||||||||||||||||||||||||||||||
[…] |
角括弧は選択条件を示し、括弧は条件を示します | //dog[@color='white'] | 色が白のすべての犬ノード | |||||||||||||||||||||||||||||||||||||||||||||||||
//dog[/priceすべての価格バイト犬ノードポイント値が 100 未満の場合 | 括弧内の数字はノードのインデックスで、C# などの言語の配列と同様に、配列の添字は 1 から始まります | //dog [1] | ||||||||||||||||||||||||||||||||||||||||||||||||||
//dog[last()] | ||||||||||||||||||||||||||||||||||||||||||||||||||||
| |
垂直バーはマージされたノードの組み合わせを表します | |||||||||||||||||||||||||||||||||||||||||||||||||||
//dog[@color='white'] //cat[@color='white'] | dog ノードと色属性を白に設定し、カラー属性を白に設定した猫ノード | |||||||||||||||||||||||||||||||||||||||||||||||||||
* |
アスタリスクは任意の名前のノードまたは属性を表します | //dog/* | はすべてを表します犬ノードの子ノード | |||||||||||||||||||||||||||||||||||||||||||||||||
//dog/@* 犬ノードのすべての属性ノードを表します |
ancestor | 現在のノードの親ノード | ancestor::pig | 現在のノードの祖先ノードのpigノード |
先祖か-self
|
現在のノードとその親ノード | ancestor::pig | |
現在のノードのすべての属性 |
属性::重量 |
@weightと同等、attribute::と@は同等 | |
child | 現在のノードの全バイトポイント | child::*[name()!='price'] | 名前がpriceではない子ノードを選択してください |
descendant | descendantノード | descendant::*[@*] | descendant属性を持つノード |
descendant-or-self | 子孫ノードと現在のノード | descendant-or-self::* | |
現在のノード以降のすべてのノードXML ドキュメント | Following::* | ||
現在のノードの同父弟ノード | following-sibling:: | ||
Xmlドキュメント | preceding::* | の現在のノードより前のすべてのノード |
|
namespace::* |
parent | ||
parent:: | はdouble pointに相当します。 | preceding-sibling |
現在のノード以降も同様 父と弟のノード |
preceding-sibling::* |
self |
現在のノード | |
は 1 つのポイントに相当します。 |
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(); } } } ログイン後にコピー 以上就是xml学习(6) 在c#Xpath实例的内容,更多相关内容请关注PHP中文网(www.php.cn)! |