溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

在c#中如何使用Xpath

發(fā)布時(shí)間:2021-09-17 15:26:45 來(lái)源:億速云 閱讀:212 作者:小新 欄目:編程語(yǔ)言

小編給大家分享一下在c#中如何使用Xpath,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

在c#中,我們經(jīng)常查找,遍歷節(jié)點(diǎn),這是我們可以用到XPath語(yǔ)法,XPath語(yǔ)法很簡(jiǎn)單,但是強(qiáng)大夠用,XPath可以快速定位到Xml中的節(jié)點(diǎn)或者屬性,它也是使用xslt的基礎(chǔ)知識(shí)

示例Xml:

<?xml version="1.0" encoding="utf-8" ?>  
<pets>  
<cat color="black" weight="10">  
<price>100</price>  
<desc>this is a black cat</desc>  
</cat>  
<cat color="white" weight="9">  
<price>80</price>  
<desc>this is a white cat</desc>  
</cat>  
<cat color="yellow" weight="15">  
<price>80</price>  
<desc>this is a yellow cat</desc>  
</cat>  
   
   
<dog color="black" weight="10">  
<price>100</price>  
<desc>this is a black dog</desc>  
</dog>  
<dog color="white" weight="9">  
<price>80</price>  
<desc>this is a white dog</desc>  
</dog>  
<dog color="yellow" weight="15">  
<price>80</price>  
<desc>this is a yellow dog</desc>  
</dog>  
</pets>

XPath的語(yǔ)法:

1. XPath中的符號(hào)

符號(hào)

說(shuō)明

示例

示例說(shuō)明

/

表示從根節(jié)點(diǎn)開(kāi)始選擇

/pets

選擇根節(jié)點(diǎn)pets

表示節(jié)點(diǎn)和子節(jié)點(diǎn)之間的間隔符

/pets/dog

選擇pets節(jié)點(diǎn)下的dog節(jié)點(diǎn)

//xx

表示從整個(gè)xml文檔中查找,而不考慮當(dāng)前節(jié)點(diǎn)位置

//price

選擇文檔中所有的price節(jié)點(diǎn)

.

單個(gè)英文半角句點(diǎn)表示選擇當(dāng)前節(jié)點(diǎn)

/pets/.

選擇pets節(jié)點(diǎn)

..

雙點(diǎn),表示選擇父節(jié)點(diǎn)

/pets/dog[0]/..

表示pets節(jié)點(diǎn),也就是第一個(gè)dog節(jié)點(diǎn)的父節(jié)點(diǎn)

@xx

表示選擇屬性

//dog/@color

表示選擇所有dog節(jié)點(diǎn)的color屬性集合

[…]

中括號(hào)表示選擇條件,括號(hào)內(nèi)為條件

//dog[@color=’white’]

所有color為white的dog節(jié)點(diǎn)

//dog[/price<100]

所有price字節(jié)點(diǎn)值小于100的dog節(jié)點(diǎn)

中括號(hào)內(nèi)數(shù)字為節(jié)點(diǎn)索引,類(lèi)似c#等語(yǔ)言中的數(shù)組,數(shù)組下標(biāo)是從1開(kāi)始的

//dog[1]

第1個(gè)dog節(jié)點(diǎn)

//dog[last()]

最后一個(gè)dog節(jié)點(diǎn),last()是xPath內(nèi)置函數(shù)

|

單豎杠表示合并節(jié)點(diǎn)結(jié)合

//dog[@color=’white’] | //cat[@color=’white’]

color屬性為white的dog節(jié)點(diǎn)和color屬性為white的cat節(jié)點(diǎn)

*

星號(hào)表示任何名字的節(jié)點(diǎn)或者屬性

//dog/*

表示dog節(jié)點(diǎn)的所有子節(jié)點(diǎn)

//dog/@*

表示dog節(jié)點(diǎn)的所有屬性節(jié)點(diǎn)

2. XPath數(shù)學(xué)運(yùn)算符

+ 加號(hào)表示加

- 表示數(shù)字相減

* 表示乘以

p 表示除以,這里數(shù)學(xué)上的除號(hào)/已經(jīng)被用作節(jié)點(diǎn)之間分隔符了

mod 表示取余

3. XPath邏輯運(yùn)算符

= 等于,相當(dāng)于c#中的 ==

!= 不等于

> 大于

>= 大于等于

< 小于

<= 小于等于

and 并且 與關(guān)系

or 或者 或關(guān)系

4. XPath Axes 從字面翻譯這個(gè)是XPath軸的意思,但根據(jù)我的理解這個(gè)翻譯成XPath節(jié)點(diǎn)關(guān)系運(yùn)算關(guān)鍵字更合適,就是一組關(guān)鍵字加上::雙冒號(hào)表示和當(dāng)前節(jié)點(diǎn)有關(guān)系的一個(gè)或者一組節(jié)點(diǎn).

使用語(yǔ)法: axisname::nodetest[predicate] 即軸名字::節(jié)點(diǎn)名字[取節(jié)點(diǎn)條件]

具體說(shuō)明如下:

關(guān)鍵字

說(shuō)明

示例

示例說(shuō)明

ancestor

當(dāng)前節(jié)點(diǎn)的父祖節(jié)點(diǎn)

ancestor::pig

當(dāng)前節(jié)點(diǎn)的祖先節(jié)點(diǎn)中的pig節(jié)點(diǎn)

ancestor-or-self

當(dāng)前節(jié)點(diǎn)以及其父祖節(jié)點(diǎn)

ancestor::pig


attribute

當(dāng)前節(jié)點(diǎn)的所有屬性

attribute::weight

相當(dāng)于@weight,attribute::和@是等價(jià)的

child

當(dāng)前節(jié)點(diǎn)的所有字節(jié)點(diǎn)

child::*[name()!=’price’]

選擇名字不是price的子節(jié)點(diǎn)

descendant

子孫節(jié)點(diǎn)

descendant::*[@*]

有屬性的子孫節(jié)點(diǎn)

descendant-or-self

子孫節(jié)點(diǎn)以及當(dāng)前節(jié)點(diǎn)

descendant-or-self::*


following

Xml文檔中當(dāng)前節(jié)點(diǎn)之后的所有節(jié)點(diǎn)

following::*


following-sibling

當(dāng)前節(jié)點(diǎn)的同父弟弟節(jié)點(diǎn)

following-sibling::


preceding

Xml文檔中當(dāng)前節(jié)點(diǎn)之前的所有節(jié)點(diǎn)

preceding::*


namespace

選取當(dāng)前節(jié)點(diǎn)的所有命名空間節(jié)點(diǎn)

namespace::*


parent

當(dāng)前節(jié)點(diǎn)的父節(jié)點(diǎn)

parent::

相當(dāng)于雙點(diǎn)..

preceding-sibling

當(dāng)前節(jié)點(diǎn)之后的同父兄節(jié)點(diǎn)

preceding-sibling::*


self

當(dāng)前節(jié)點(diǎn)

self::*

相當(dāng)于單點(diǎn).

5. 常用的XPath函數(shù)介紹:

在XPath表達(dá)式中常用的函數(shù)有下面兩個(gè):

position() 表示節(jié)點(diǎn)的序號(hào)例如 //cat[position() = 2] 表示取序號(hào)為2的dog節(jié)點(diǎn)

last() 表示取最后一個(gè)節(jié)點(diǎn) //cat[last()]

name() 表示當(dāng)前節(jié)點(diǎn)名字 /pets/*[name() != 'pig'] 表示/pets下名字不是pig的子節(jié)點(diǎn)

XPath的函數(shù)還有很多,包括字符串函數(shù),數(shù)字函數(shù)和時(shí)間函數(shù)等,具體可以參考w3的網(wǎng)站。

以上是XPath的語(yǔ)法,下面我們看下如何在.Net中使用XPath

在.Net中可以通過(guò)XPathDocument或者XmlDocument類(lèi)使用XPath。XPathDocument是只讀的方式定位Xml節(jié)點(diǎn)或者屬性文本等,而XmlDocument則是可讀寫(xiě)的。

如下代碼示例展示了如何使用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選擇需要的節(jié)點(diǎn)
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使用示例,請(qǐng)看下面的代碼注釋 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Xml;
 
namespace UseXPath2
{
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節(jié)點(diǎn)下的dog字節(jié)點(diǎn)
XmlNodeList nodeListAllDog = doc.SelectNodes("/pets/dog");
 
//所有的price節(jié)點(diǎn)
XmlNodeList allPriceNodes = doc.SelectNodes("//price");
 
//取最后一個(gè)price節(jié)點(diǎn)
XmlNode lastPriceNode = doc.SelectSingleNode("//price[last()]");
 
//用雙點(diǎn)號(hào)取price節(jié)點(diǎn)的父節(jié)點(diǎn)
XmlNode lastPriceParentNode = lastPriceNode.SelectSingleNode("..");
 
//選擇weight*count=40的所有動(dòng)物,使用通配符*
XmlNodeList nodeList = doc.SelectNodes("/pets/*[@weight*@count=40]");
 
//選擇除了pig之外的所有動(dòng)物,使用name()函數(shù)返回節(jié)點(diǎn)名字
XmlNodeList animalsExceptPigNodes = doc.SelectNodes("/pets/*[name() != 'pig']");
 
 
//選擇價(jià)格大于100而不是pig的動(dòng)物
XmlNodeList priceGreaterThan100s = doc.SelectNodes("/pets/*[price p @weight >10 and name() != 'pig']");
foreach (XmlNode item in priceGreaterThan100s)
{
Console.WriteLine(item.OuterXml);
}
 
//選擇第二個(gè)dog節(jié)點(diǎn)
XmlNode theSecondDogNode = doc.SelectSingleNode("//dog[position() = 2]");
 
//使用xpath ,axes 的 parent 取父節(jié)點(diǎn)
XmlNode parentNode = theSecondDogNode.SelectSingleNode("parent::*");
 
//使用xPath選擇第二個(gè)dog節(jié)點(diǎn)前面的所有dog節(jié)點(diǎn)
XmlNodeList dogPresibling = theSecondDogNode.SelectNodes("preceding::dog");
 
//取文檔的所有子孫節(jié)點(diǎn)price
XmlNodeList childrenNodes = doc.SelectNodes("descendant::price");
}
 
Console.Read();
}
}
}

以上是“在c#中如何使用Xpath”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI