最近在用到HtmlAgliltyPack进行结点查询时,发现这里选择结点使用的是XPath。所以这里总结一下在C#中使用XPath查询XML的方式。习惯了用Linq,这里也是用的Linq to xml的。
Linq To XML的核心类是XDocument和XElement、XAttribute,下面简单介绍一下使用。需要引用using System.Xml.Linq命名空间
这三个类简单理解为:
XDocument:打开的整个XML文档
XElement:节点元素
XAttribute:属性
如有以下XML文件
测试XML汪家羊肉馆
打开XML文件
1 XDocument doc = XDocument.Load("demo.xml");
获取根节点(html节点 返回XElement类型)
var root = doc.Root;
获取第一个子节点(返回XElement类型)
1 var firstNode = root.FirstNode;
获取全部子节点(返回IEnumerable)
1 var allChildNode = root.Nodes();
获取指定名称的第一个子节点(返回XElement类型)
1 var headNode = root.Element("head");
获取指定名称的全部子节点(返回IEnumerable)
var allNamedNode = root.Elements("head");
获取节点指定名称的属性(
1 var attribute = root.Element("body").Element("div").Attribute("class");
获取节点的全部属性
1 var allAttributes = root.Attributes();
使用XPath查询(需要引用using System.Xml.XPath命名空间)
1 var xpathQeury = root.XPathSelectElement("body/div");
获取节点的名称和值
1 //获取结点的名称
2 var nodeName = root.Name;
3 //获取节点的值
4 var nodeValue = root.Value;
保存XML
1 doc.Save("demo.xml");
Linq查询(获取¥12/人节点下的值)
这里仅做示例,返回返回IEnumerable类型的都可以进行Linq查询
不使用XPath
1 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();
2 if(queryResult != null)
3 Console.WriteLine(queryResult.Value);
使用XPath
1 var xpathQueryResult = root.XPathSelectElements("body/div/div[2]/span").Where(x => x.Attribute("class") != null && x.Attribute("class").Value == "price2").FirstOrDefault();
2 if(xpathQueryResult != null)
3 Console.WriteLine(xpathQueryResult.Value);
输出结果都为下
标签:XML,XPath,C#,Linq,var,root,节点
来源: https://www.cnblogs.com/zhaotianff/p/11319871.html
¥62/人
¥12/人