当前位置: 代码网 > it编程>编程语言>Asp.net > C#使用Linq to XML进行XPath查询的代码实现

C#使用Linq to XML进行XPath查询的代码实现

2024年08月14日 Asp.net 我要评论
最近在用到htmlagliltypack进行结点查询时,发现这里选择结点使用的是xpath。所以这里总结一下在c#中使用xpath查询xml的方法。习惯了用linq,这里也是用的linq to xml

最近在用到htmlagliltypack进行结点查询时,发现这里选择结点使用的是xpath。所以这里总结一下在c#中使用xpath查询xml的方法。习惯了用linq,这里也是用的linq to xml的。

linq to xml的核心类是xdocumentxelementxattribute,需要引用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查询的资料请关注代码网其它相关文章!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com