最近在用到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 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");获取根节点(html节点 返回xelement类型)
var root = doc.root;
获取第一个子节点(返回xelement类型)
var firstnode = root.firstnode;
获取全部子节点(返回ienumerable<xnode>)
var allchildnode = root.nodes();
获取指定名称的第一个子节点(返回xelement类型)
var headnode = root.element("head");获取指定名称的全部子节点(返回ienumerable<xelement>)
var allnamednode = root.elements("head");获取节点指定名称的属性(<div class="card-container"> )
var attribute = root.element("body").element("div").attribute("class");获取节点的全部属性
var allattributes = root.attributes();
使用xpath查询(需要引用using system.xml.xpath命名空间)
var xpathqeury = root.xpathselectelement("body/div");获取节点的名称和值
//获取结点的名称
var nodename = root.name;
//获取节点的值
var nodevalue = root.value;保存xml
doc.save("demo.xml");linq查询(获取<span class="price2">¥12/人</span>节点下的值)
这里仅做示例,返回返回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);输出结果都为下

下面开始介绍xpath
xpath 是 xml 文档中查找信息的语言,使用xpath可以对xml的元素进行查找。
这里重着介绍一下xpath语法
/ 从根节点开始选择
var xpathroot = doc.xpathselectelement("/html");
var xpathroot2 = doc.xpathselectelement("html");运行结果

// 获取文档中所有指定的结点,不管它的位置
如要获取xml文档中所有的span节点
//以下获取的结果都是一样的
//尽管位置不一样,但查询结果是一样的
var body = root.element("body").element("div").elements("div").elementat(1);
var alldivnodeinbody = body.xpathselectelements("//div");
var alldivnodeindoc = doc.xpathselectelements("//div");
console.writeline(alldivnodeinbody.count());
console.writeline(alldivnodeindoc.count());运行结果

.当前节点
var currentnode = root.xpathselectelement(".");运行结果

..当前节点的父节点
var parentnode = root.element("body").xpathselectelement("..");运行结果

@ 选取属性
这个操作在linq to xml里不支持,会产生一个"xpath 表达式的计算结果为意外类型 system.xml.linq.xattribute。"异常
通配查询 * 全部节点 @* 全部属性(不支持)
谓词查询 选择第一个查询结果,如<span class="price1">¥62/人</span>
var firstspannode = doc.xpathselectelement("//span[1]");运行结果

选择最后一个查询结果,如最后一个<span class="price4">12</span>
var lastdivnode = doc.xpathselectelement("//span[last()]");
console.writeline(lastdivnode.attribute("class").value);运行结果

选择带有属性class的div节点
var nodewithclassattribute = doc.xpathselectelements("//div[@class]");
foreach (var item in nodewithclassattribute)
{
console.writeline("====================");
console.writeline(item);
}运行结果

选择带有属性class,且值为item-title的div节点
var nodewithclassvalueattribute = doc.xpathselectelements("//div[@class='item-title']");
foreach (var item in nodewithclassvalueattribute)
{
console.writeline(item);
}运行结果

简单的选择计算 获取倒数第二个div节点
var nexttolastdivnode = doc.xpathselectelement("//div[last()-1]");运行结果

获取值大于10的span节点
var greaterthantenspan = doc.xpathselectelements("//span[text()>10]");运行结果:

获取值加10等于22的span节点
var plustenspan = doc.xpathselectelements("//span[text()+10=22]");运行结果:

常用运行符如下
+ 加
- 减
* 乘
div 除
= 等于
!= 不等于
> 大于
< 小于
>= 大于等于
<= 小于等于
or 或
and 与
组合查询
如查询值等于12或等于2的span节点
var combinequery = doc.xpathselectelements("//span[text()=2]|//span[text()=12]");
foreach (var item in combinequery)
{
console.writeline(item.value);
}运行结果

以上就是c#使用linq to xml进行xpath查询的代码实现的详细内容,更多关于c# linq to xml进行xpath查询的资料请关注代码网其它相关文章!
发表评论