【问题标题】:Querying elements in Xpath using C#使用 C# 在 Xpath 中查询元素
【发布时间】:2020-10-15 11:29:31
【问题描述】:

我在一些文档 here 的帮助下学习 Xpath,并且遇到了一个特定的查询。在以下 XML 中,我尝试打印出价格大于 10 的书籍的 <OwnerName><value>,我使用以下 Xpath Query 来执行此操作

    strExpression = "/bookstore/book/name/value[../price>10.00]";

    NodeIter = nav.Select(strExpression);

    Console.WriteLine("Names of expensive books owners:");

    while (NodeIter.MoveNext())
    {
        Console.WriteLine("Owner Name: {0}", NodeIter.Current.Value);
    };


<?xml version="1.0" encoding="UTF-8"?>
<!-- This file represents a fragment of a book store inventory database -->
<bookstore>
   <book genre="autobiography">
      <OwnerName>
         <value>Alex dan</value>
      </OwnerName>
      <title>The Autobiography of Benjamin Franklin</title>
      <author>
         <first-name>Benjamin</first-name>
         <last-name>Franklin</last-name>
      </author>
      <price>8.99</price>
   </book>
   <book genre="novel">
      <OwnerName>
         <value>Pam Sanderson</value>
      </OwnerName>
      <title>The Confidence Man</title>
      <author>
         <first-name>Herman</first-name>
         <last-name>Melville</last-name>
      </author>
      <price>11.99</price>
   </book>
   <book genre="philosophy">
      <OwnerName>
         <value>Rogger Mark</value>
      </OwnerName>
      <title>The Gorgias</title>
      <author>
         <name>Plato</name>
      </author>
      <price>9.99</price>
   </book>
</bookstore>

我在这里做错了什么非常感谢一些帮助

【问题讨论】:

  • 请注意,您学习的 XPath 版本已有 20 年历史并已被长期取代。 Microsoft 没有跟上 XML 世界的变化。但是,它不影响这个例子。
  • 最新的迈克尔是什么?任何文件:)
  • XPath 的当前版本是 3.1。介于两者之间的是 XPath 2.0。搜索其中任何一个都会找到大量信息——更多关于 2.0 的信息,因为它已经存在了更长的时间。很大程度上取决于您喜欢阅读哪种信息:就我个人而言,我直接阅读 W3C 规范。

标签: c# .net xml xpath


【解决方案1】:

首先,需要更改 XPath 表达式。

代替

strExpression = "/bookstore/book/name/value[../price>10.00]";

使用

strExpression = "/bookstore/book[price>10.00]/OwnerName/value";

【讨论】:

    【解决方案2】:

    你写:

    /bookstore/book/name/value[../price>10.00]
    

    为什么它不起作用:

    • 在 XPath 表达式的开头缺少 /(查看任何地方)
    • 您调用的是name 元素而不是ownername 元素
    • 缺少一个..(父运算符),因为您想使用/pricebook 的子代而不是ownername
    • 缺少[](谓词)来测试book 节点或price 节点

    总而言之,要修复您的 XPath(按照您的逻辑),您可以使用 2 种语法:

    //bookstore/book/ownername/value[../../price[.>10]]
    //bookstore/book/ownername/value[../..[price>10]]
    

    其他选项(或多或少消耗):

    //value[../..[price>10]]
    //value[ancestor::book[1][price>10]]
    //price[.>10]/preceding::value[1]
    

    【讨论】:

      猜你喜欢
      • 2015-11-15
      • 2012-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多