C#使用Linq to XML進行XPath查詢的代碼實現(xiàn)
最近在用到HtmlAgliltyPack進行結(jié)點查詢時,發(fā)現(xiàn)這里選擇結(jié)點使用的是XPath。所以這里總結(jié)一下在C#中使用XPath查詢XML的方法。習慣了用Linq,這里也是用的Linq to xml的。
Linq To XML的核心類是XDocument和XElement、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#中Task.ContinueWith連續(xù)任務(wù)使用實例
本文主要介紹了C#中Task.ContinueWith連續(xù)任務(wù)使用實例,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-02-02詳解C#中==、Equals、ReferenceEquals的區(qū)別
C#中Equals , == , ReferenceEquals都可以用于判斷兩個對象的個體是不是相等,本篇文章詳解C#中Equals , == , ReferenceEquals都可以用于判斷兩個對象的個體是不是相等,有興趣的可以了解一下。2016-12-12