ホームページ >バックエンド開発 >XML/RSS チュートリアル >XPath 構文: C# で XPath の例を使用するための具体的なコードの紹介

XPath 構文: C# で XPath の例を使用するための具体的なコードの紹介

黄舟
黄舟オリジナル
2017-03-09 16:55:101810ブラウズ

XPath は、Xml 内のノードまたは属性をすばやく見つけることができます。 XPath 構文はシンプルですが、十分強力です。xslt を使用するための基礎知識でもあります。


シンボル




説明 例 説明例を選択//犬[1]*







/

は、ルートノードから開始して



/pets



ルートノードを選択することを意味しますペット



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



/pets/dog



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



//xx



は、現在のノードの位置に関係なくxmlドキュメント全体から検索することを意味します



/ /price



すべてのpriceノード



を選択します。



シングル英語の半角ピリオドは現在のノードの選択を示します



/pets/.



ペットノード



..



二重点は親ノードの選択を示します



/pets/dog[0]/..



は、最初のdogノード



@xx

の親ノードである

pets

ノードを表します。


は属性を選択することを意味します



//dog/@color



はすべてを選択することを意味しますgノードカラー属性コレクション



[…]



角括弧は選択条件を示し、括弧内は条件を示します



// Dog[@color ='white']



すべてのcolorwhitedogノード



//犬[/価格



すべてのdogノード



は、

c#や他の言語と同様のノードインデックスです。 配列の添字は1から始まります




ノード1

最後の

dog
ノード、

last()


xPath

組み込み関数です



|

単一の垂直バーは、マージされたノードの組み合わせを表します



//dog[@color='white'] //cat[@color='white']

|


colorwhite属性を持つdogノードとcatノード





アスタリスクは、任意の名前のノードまたは属性を表します



//dog/*



は、dogノードのすべての子ノードを表します



// Dog /@*



は、dogノードのすべての属性ノードを表します






2.

p

は除算を意味し、数学的な除算記号 / ここではノード間の区切り記号として使用されています

mod

は剰余を取ることを意味します

3. XPath 論理演算子

=

等しい、C# の ==!=


>

はより大きい

>=

はより大きい

<

より小さい and

以下 そして、関係

or

or or 関係

4. XPath 軸

直訳すると XPath 軸を意味しますが、私の理解によれば、これは XPath ノード リレーショナル操作キーワードに翻訳されます。これは、関連するノードまたはノードのグループを示す一連のキーワードに ::二重コロンを加えたものです。

構文を使用します: axisname::nodetest[predicate]、つまり、axis name::node name[ノード条件を取得]

具体的な手順は次のとおりです:



キーワード


現在のノードの親ノードポイント2倍相当

説明





説明例



先祖



現在のノードの親ノード



ancestor::pig



ances現在のノード pignode

の Tor
ノード内


ancestor-or-self



現在のノードとその親ノード



先祖::豚




属性



現在のノードのすべての属性



attribute::weight



は次と同等です @weight属性::、および@ は、現在のノードの



child



と同等です



子: :*[名前()!='価格']



名前が price



descendant



ではない子ノードを選択します

子孫ノード



descendant::*[@*]



属性を持つ子孫ノード



子孫 - または - 自分自身



子孫ノードと現在のノード



子孫または自分自身::*




フォロー中



Xml現在のノードの後



のすべてのノード:*




次の兄弟



現在のノードと同じ父親と弟のノード



次の兄弟::





Xml

のdocument 現在のノードの前のすべてのノード



preceding::*




名前空間


現在のノードの名前空間ノードをすべて選択します


名前空間::*






親::



..



先行兄弟



現在のノードの後の同じ父ノードと兄弟ノード



preceding-sibling::*




自分



現在のノード



自分::*



アラカルトに相当します。






5. 常用的XPath函数介绍:

在XPath表达式中常用的函数有下面两个:

position() 表示节点的序号例如 //cat[position() = 2] 表示取序号为2的dog节点
last() 表示取最后一个节点 //cat[last()] 
name() 表示当前节点名字 /pets/*[name() != &#39;pig&#39;] 表示/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();
        }
    }
}



以上がXPath 構文: C# で XPath の例を使用するための具体的なコードの紹介の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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