C#使用Linq to XML進(jìn)行XPath查詢的代碼實現(xiàn)
最近在用到HtmlAgliltyPack進(jìn)行結(jié)點(diǎn)查詢時,發(fā)現(xiàn)這里選擇結(jié)點(diǎn)使用的是XPath。所以這里總結(jié)一下在C#中使用XPath查詢XML的方法。習(xí)慣了用Linq,這里也是用的Linq to xml的。
Linq To XML的核心類是XDocument和XElement、XAttribute,需要引用using System.Xml.Linq命名空間。
這三個類簡單理解為:
XDocument:打開的整個XML文檔
XElement:節(jié)點(diǎn)元素
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é)點(diǎn)(html節(jié)點(diǎn) 返回XElement類型)
var root = doc.Root;
獲取第一個子節(jié)點(diǎn)(返回XElement類型)
var firstNode = root.FirstNode;
獲取全部子節(jié)點(diǎn)(返回IEnumerable<XNode>)
var allChildNode = root.Nodes();
獲取指定名稱的第一個子節(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可以對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é)果

@ 選取屬性
這個操作在Linq to xml里不支持,會產(chǎn)生一個"XPath 表達(dá)式的計算結(jié)果為意外類型 System.Xml.Linq.XAttribute。"異常
通配查詢 * 全部節(jié)點(diǎn) @* 全部屬性(不支持)
謂詞查詢 選擇第一個查詢結(jié)果,如<span class="price1">¥62/人</span>
var firstSpanNode = doc.XPathSelectElement("http://span[1]");運(yùn)行結(jié)果

選擇最后一個查詢結(jié)果,如最后一個<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é)果

簡單的選擇計算 獲取倒數(shù)第二個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查詢的代碼實現(xiàn)的詳細(xì)內(nèi)容,更多關(guān)于C# Linq to XML進(jìn)行XPath查詢的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C#基于Linq和反射實現(xiàn)數(shù)據(jù)持久化框架Xml4DB詳解
在本篇文章里小編給大家整理的是關(guān)于C#基于Linq和反射實現(xiàn)數(shù)據(jù)持久化框架Xml4DB相關(guān)知識點(diǎn),有需要的朋友們學(xué)習(xí)下。2019-08-08

