亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

C#使用Linq to XML進(jìn)行XPath查詢的代碼實(shí)現(xiàn)

 更新時(shí)間:2024年08月14日 10:13:42   作者:△曉風(fēng)殘?jiān)漏e  
最近在用到HtmlAgliltyPack進(jìn)行結(jié)點(diǎn)查詢時(shí),發(fā)現(xiàn)這里選擇結(jié)點(diǎn)使用的是XPath,所以這里總結(jié)一下在C#中使用XPath查詢XML的方法,習(xí)慣了用Linq,這里也是用的Linq to xml的,需要的朋友可以參考下

最近在用到HtmlAgliltyPack進(jìn)行結(jié)點(diǎn)查詢時(shí),發(fā)現(xiàn)這里選擇結(jié)點(diǎn)使用的是XPath。所以這里總結(jié)一下在C#中使用XPath查詢XML的方法。習(xí)慣了用Linq,這里也是用的Linq to xml的。

Linq To XML的核心類是XDocumentXElement、XAttribute,需要引用using System.Xml.Linq命名空間。

這三個(gè)類簡(jiǎn)單理解為:

XDocument:打開的整個(gè)XML文檔

XElement:節(jié)點(diǎn)元素

XAttribute:屬性

下面簡(jiǎn)單介紹一下使用。

如有以下XML文件

  <?xml version="1.0" encoding="utf-8"?>
  <html>
    <head>
      <title>測(cè)試XML</title>
    </head>
    <body>
      <div class="card-container">
        <div class="item-title">
          <h3 class="item-shop-name">汪家羊肉館</h3>
        </div>
        <div class="item-comment">
          <span class="price1">¥62/人</span>
          <span class="price2">¥12/人</span>
          <span class="price3">2</span>
          <span class="price4">12</span>
        </div>
      </div>
    </body>
  </html>

打開XML文件

XDocument doc = XDocument.Load("demo.xml");

獲取根節(jié)點(diǎn)(html節(jié)點(diǎn) 返回XElement類型)

var root = doc.Root;

獲取第一個(gè)子節(jié)點(diǎn)(返回XElement類型)

var firstNode = root.FirstNode;

獲取全部子節(jié)點(diǎn)(返回IEnumerable<XNode>)

var allChildNode = root.Nodes();

獲取指定名稱的第一個(gè)子節(jié)點(diǎn)(返回XElement類型)

var headNode = root.Element("head");

獲取指定名稱的全部子節(jié)點(diǎn)(返回IEnumerable<XElement>)

var allNamedNode = root.Elements("head");

獲取節(jié)點(diǎn)指定名稱的屬性(<div class="card-container"> )

var attribute = root.Element("body").Element("div").Attribute("class");

獲取節(jié)點(diǎn)的全部屬性

var allAttributes = root.Attributes();

使用XPath查詢(需要引用using System.Xml.XPath命名空間)

var xpathQeury = root.XPathSelectElement("body/div");

獲取節(jié)點(diǎn)的名稱和值

   //獲取結(jié)點(diǎn)的名稱
    var nodeName = root.Name;
    //獲取節(jié)點(diǎn)的值
    var nodeValue = root.Value;

保存XML

doc.Save("demo.xml");

Linq查詢(獲取<span class="price2">¥12/人</span>節(jié)點(diǎn)下的值)

這里僅做示例,返回返回IEnumerable<XElement>類型的都可以進(jìn)行Linq查詢

不使用XPath

 var queryResult = root.Element("body").Element("div").Elements("div").ElementAt(1).Elements("span").Where(x=>x.Attribute("class") != null && x.Attribute("class").Value == "price2").FirstOrDefault();
             if(queryResult != null)
                 Console.WriteLine(queryResult.Value);

使用XPath

 var xpathQueryResult = root.XPathSelectElements("body/div/div[2]/span").Where(x => x.Attribute("class") != null && x.Attribute("class").Value == "price2").FirstOrDefault();
             if(xpathQueryResult != null)
                 Console.WriteLine(xpathQueryResult.Value);

輸出結(jié)果都為下

下面開始介紹XPath

XPath 是 XML 文檔中查找信息的語言,使用XPath可以對(duì)XML的元素進(jìn)行查找。

這里重著介紹一下XPath語法

/    從根節(jié)點(diǎn)開始選擇

 var xpathRoot = doc.XPathSelectElement("/html");
 var xpathRoot2 = doc.XPathSelectElement("html");

運(yùn)行結(jié)果

//   獲取文檔中所有指定的結(jié)點(diǎn),不管它的位置

如要獲取xml文檔中所有的span節(jié)點(diǎn)

             //以下獲取的結(jié)果都是一樣的
             //盡管位置不一樣,但查詢結(jié)果是一樣的
             var body = root.Element("body").Element("div").Elements("div").ElementAt(1);
             var allDivNodeInBody = body.XPathSelectElements("http://div");
             var allDivNodeInDoc = doc.XPathSelectElements("http://div");
             Console.WriteLine(allDivNodeInBody.Count());
             Console.WriteLine(allDivNodeInDoc.Count());

運(yùn)行結(jié)果

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

var currentNode = root.XPathSelectElement(".");

運(yùn)行結(jié)果

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

var parentNode = root.Element("body").XPathSelectElement("..");

運(yùn)行結(jié)果

@  選取屬性

這個(gè)操作在Linq to xml里不支持,會(huì)產(chǎn)生一個(gè)"XPath 表達(dá)式的計(jì)算結(jié)果為意外類型 System.Xml.Linq.XAttribute。"異常

通配查詢 *     全部節(jié)點(diǎn) @*  全部屬性(不支持)

謂詞查詢 選擇第一個(gè)查詢結(jié)果,如<span class="price1">¥62/人</span>

var firstSpanNode = doc.XPathSelectElement("http://span[1]");

運(yùn)行結(jié)果

選擇最后一個(gè)查詢結(jié)果,如最后一個(gè)<span class="price4">12</span>

 var lastDivNode = doc.XPathSelectElement("http://span[last()]");
 Console.WriteLine(lastDivNode.Attribute("class").Value);

運(yùn)行結(jié)果

選擇帶有屬性class的div節(jié)點(diǎn)

 var nodeWithClassAttribute = doc.XPathSelectElements("http://div[@class]");
             foreach (var item in nodeWithClassAttribute)
             {
                 Console.WriteLine("====================");
                 Console.WriteLine(item);
             }

運(yùn)行結(jié)果

選擇帶有屬性class,且值為item-title的div節(jié)點(diǎn)

  var nodeWithClassValueAttribute = doc.XPathSelectElements("http://div[@class='item-title']");
             foreach (var item in nodeWithClassValueAttribute)
             {
                 Console.WriteLine(item);
             }

運(yùn)行結(jié)果

簡(jiǎn)單的選擇計(jì)算 獲取倒數(shù)第二個(gè)div節(jié)點(diǎn)

var nextToLastDivNode = doc.XPathSelectElement("http://div[last()-1]");

運(yùn)行結(jié)果

獲取值大于10的span節(jié)點(diǎn)

var greaterThanTenSpan = doc.XPathSelectElements("http://span[text()>10]");

運(yùn)行結(jié)果:

獲取值加10等于22的span節(jié)點(diǎn)

var plusTenSpan = doc.XPathSelectElements("http://span[text()+10=22]");

運(yùn)行結(jié)果:

常用運(yùn)行符如下

+               加

-                減

*               乘

div           除

=              等于

!=             不等于

>              大于

<              小于

>=           大于等于

<=            小于等于

or            或

and          與

組合查詢

如查詢值等于12或等于2的span節(jié)點(diǎn)

  var combineQuery = doc.XPathSelectElements("http://span[text()=2]|//span[text()=12]");
             foreach (var item in combineQuery)
             {
                 Console.WriteLine(item.Value);
             }

運(yùn)行結(jié)果

以上就是C#使用Linq to XML進(jìn)行XPath查詢的代碼實(shí)現(xiàn)的詳細(xì)內(nèi)容,更多關(guān)于C# Linq to XML進(jìn)行XPath查詢的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • c#事件使用示例詳解

    c#事件使用示例詳解

    這篇文章主要介紹了c#事件使用方法,下面我們利用一個(gè)例子來加深我們對(duì)事件的理解,需要的朋友可以參考下
    2014-04-04
  • 聊聊C#中的Mixin的具體用法

    聊聊C#中的Mixin的具體用法

    本文主要介紹了C#中的Mixin的具體用法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-05-05
  • WinForm 自動(dòng)完成控件實(shí)例代碼簡(jiǎn)析

    WinForm 自動(dòng)完成控件實(shí)例代碼簡(jiǎn)析

    在Web的應(yīng)用方面有js的插件實(shí)現(xiàn)自動(dòng)完成(或叫智能提示)功能,但在WinForm窗體應(yīng)用方面就沒那么好了,接下來參考一下這個(gè)實(shí)例,看看有沒有以外收獲,感興趣的朋友可以了解下啊,希望本文對(duì)你有幫助啊
    2013-01-01
  • C#中Task.ContinueWith連續(xù)任務(wù)使用實(shí)例

    C#中Task.ContinueWith連續(xù)任務(wù)使用實(shí)例

    本文主要介紹了C#中Task.ContinueWith連續(xù)任務(wù)使用實(shí)例,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • C#下listview如何插入圖片

    C#下listview如何插入圖片

    這篇文章主要為大家詳細(xì)介紹了C#下listview如何插入圖片,如何在listview中插入圖片的每一個(gè)步驟為大家分享,感興趣的朋友可以參考一下
    2016-05-05
  • C#字符串String及字符Char的相關(guān)方法

    C#字符串String及字符Char的相關(guān)方法

    這篇文章介紹了C#字符串String及字符Char的相關(guān)方法,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-05-05
  • 詳解C#中==、Equals、ReferenceEquals的區(qū)別

    詳解C#中==、Equals、ReferenceEquals的區(qū)別

    C#中Equals , == , ReferenceEquals都可以用于判斷兩個(gè)對(duì)象的個(gè)體是不是相等,本篇文章詳解C#中Equals , == , ReferenceEquals都可以用于判斷兩個(gè)對(duì)象的個(gè)體是不是相等,有興趣的可以了解一下。
    2016-12-12
  • C#特性之匿名方法和Lambda表達(dá)式

    C#特性之匿名方法和Lambda表達(dá)式

    這篇文章主要介紹了C#特性之匿名方法和Lambda表達(dá)式,需要的朋友可以參考下
    2014-12-12
  • C#算法之羅馬數(shù)字轉(zhuǎn)整數(shù)

    C#算法之羅馬數(shù)字轉(zhuǎn)整數(shù)

    本文詳細(xì)講解了C#算法之羅馬數(shù)字轉(zhuǎn)整數(shù),文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-01-01
  • c# 圖片加密解密的實(shí)例代碼

    c# 圖片加密解密的實(shí)例代碼

    這篇文章介紹了c# 圖片加密解密的實(shí)例代碼,有需要的朋友可以參考一下
    2013-08-08

最新評(píng)論