ホームページ  >  記事  >  バックエンド開発  >  c#Xpath の例での XML 学習 (6)

c#Xpath の例での XML 学習 (6)

黄舟
黄舟オリジナル
2017-02-23 14:37:401416ブラウズ

再版: http://www.php.cn/

C# では、XPath 構文をよく使用しますが、これは非常に強力です。 XPath は、Xml 内のノードや属性を素早く見つけることができます。また、xslt の使用に関する基本的な知識でもあります

symbol


/pets/pets/dog ペットノードの下の犬ノードを選択します 最初の犬ノード最後の犬ノード、last()はxPath組み込み関数です


2. ノード間の区切り文字として使用されています mod は、剰余

3 より大きい =

& より大きい未満

<= 以下

and and 関連

or or or or relationship

4.

XPath Axes

直訳すると XPath 軸の意味ですが、私の理解によれば、これを XPath ノード関係操作キーワードに変換する方が適切です。これは、現在のノードに関連する 1 つまたはノードのグループを示す一連のキーワードと ::二重コロンを組み合わせたものです。

構文 axisname::nodetest を使用します。 [述語]は軸名::ノード名 [ノード条件の取得]

具体的な説明は以下の通りです

キーワード

説明

例の説明

例の説明

/

は、ルートノードから開始することを意味します

の選択を開始します

ルートノードペットを選択してください

はノードと子ノードの間のスペーサーを表します

//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/@*

犬ノードのすべての属性ノードを表します

attribute以下following-siblingpreceding名前空間ノードをすべて選択現在のノードの 現在のノードの親ノード現在のノード以降も同様 父と弟のノード自分: :* は 1 つのポイントに相当します。
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

現在のノード


 

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() != &#39;pig&#39;]");
 
 
//选择价格大于100而不是pig的动物
XmlNodeList priceGreaterThan100s = doc.SelectNodes("/pets/*[price p @weight >10 and name() != &#39;pig&#39;]");
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)! 


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。