欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

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

這三個類簡單理解為:

XDocument:打開的整個XML文檔

XElement:節(jié)點元素

XAttribute:屬性

下面簡單介紹一下使用

如有以下XML文件

  <?xml version="1.0" encoding="utf-8"?>
  <html>
    <head>
      <title>測試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é)點(html節(jié)點 返回XElement類型)

var root = doc.Root;

獲取第一個子節(jié)點(返回XElement類型)

var firstNode = root.FirstNode;

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

var allChildNode = root.Nodes();

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

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

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

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

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

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

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

var allAttributes = root.Attributes();

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

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

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

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

保存XML

doc.Save("demo.xml");

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

這里僅做示例,返回返回IEnumerable<XElement>類型的都可以進行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可以對XML的元素進行查找。

這里重著介紹一下XPath語法

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

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

運行結(jié)果

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

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

             //以下獲取的結(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());

運行結(jié)果

.當前節(jié)點

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

運行結(jié)果

..當前節(jié)點的父節(jié)點

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

運行結(jié)果

@  選取屬性

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

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

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

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

運行結(jié)果

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

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

運行結(jié)果

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

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

運行結(jié)果

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

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

運行結(jié)果

簡單的選擇計算 獲取倒數(shù)第二個div節(jié)點

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

運行結(jié)果

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

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

運行結(jié)果:

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

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

運行結(jié)果:

常用運行符如下

+               加

-                減

*               乘

div           除

=              等于

!=             不等于

>              大于

<              小于

>=           大于等于

<=            小于等于

or            或

and          與

組合查詢

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

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

運行結(jié)果

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

相關(guān)文章

  • c#事件使用示例詳解

    c#事件使用示例詳解

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

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

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

    WinForm 自動完成控件實例代碼簡析

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

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

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

    C#下listview如何插入圖片

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

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

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

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

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

    C#特性之匿名方法和Lambda表達式

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

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

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

    c# 圖片加密解密的實例代碼

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

最新評論