【问题标题】:"Expression must evaluate to a node-set."“表达式必须评估为节点集。”
【发布时间】:2013-07-24 06:45:52
【问题描述】:

我有问题

我的 XML 文件在这里:

<altinkaynak>

   <DOVIZ>
     <ADI>Tarih</ADI>
     <ALIS>24.07.2013 18:59:45</ALIS>
     <SATIS/>
   </DOVIZ>
   <DOVIZ>
      <ADI>USD</ADI>
      <ALIS>1.9120</ALIS>
      <SATIS>1.9220</SATIS>
   </DOVIZ>
   <DOVIZ>
      <ADI>EUR</ADI>
      <ALIS>2.5280</ALIS>
      <SATIS>2.5430</SATIS>
   </DOVIZ> 
</altinkaynak>

我如何解析这个 XML 文件

我是这样编码的,但我收到一条解析错误消息;

if (tip == DövizKuruTipi2.Alış)
Line 44: return Decimal.Parse(doc.SelectNodes("//ALTINKAYNAK/DOVIZ/ADI=" + dovizKuru2 + "/ALIS")[0].InnerText.Replace('.', ','));

表达式必须计算为节点集

【问题讨论】:

    标签: c# xml xpath


    【解决方案1】:

    错误原因

    根据错误消息,.SelectNodes() 要求 xpath 字符串参数计算为节点集,例如此 xpath 将返回一个包含 3 个节点的 XmlNodeList

    var nodeSet = document.SelectNodes("/altinkaynak/DOVIZ");
    

    提供返回单个节点的 xpath 也是可以接受的 - 返回的 XmlNodeList 将只有一个节点:

    var nodeSet = document.SelectNodes("(/altinkaynak/DOVIZ)[1]");
    

    但是,不能返回非节点值,例如标量表达式:

    var nodeSet = document.SelectNodes("count(/altinkaynak/DOVIZ)");
    

    错误:表达式必须计算为节点集。

    对于XmlDocument,您需要创建一个导航器,编译一个表达式,然后计算它:

     var navigator = document.CreateNavigator();
     var expr = navigator.Compile("count(/altinkaynak/DOVIZ)");
     var count = navigator.Evaluate(expr); // 3 (nodes)
    

    如果您将 Xml 解析堆栈从使用 XmlDocument 切换到 Linq to Xml XDocument,则有一个 much more concise way 来评估标量表达式:

    var count = xele.XPathEvaluate("count(/altinkaynak/DOVIZ)");
    

    Xpath 格式错误

    同样的错误 (Expression must evaluate to a node-set) 也经常为完全无效的 xpaths 返回

     var nodeSet = document.SelectNodes("{Insert some really badly formed xpath here!}");
    

    错误:表达式必须计算为节点集。

    OP 的问题

    您的 Xpath 中有错误。你可能想要的是这样的:

    doc.SelectNodes("//ALTINKAYNAK/DOVIZ[ADI='" + dovizKuru2 + "']/ALIS") // ...
    

    这将返回DOVIZ 元素的ALIS 子元素,该元素的ADI 子元素的值为dovizKuru2(可能是USD 等货币的变量)

    【讨论】:

    • 实际上Some/Really=badly[@formed='xpath'] 在语法上是有效的并且返回一个布尔值。如果您将其替换为A/B = C[@X=3],您会发现它非常有意义。
    【解决方案2】:

    我收到此错误是因为我的 Xpath 表达式无效。我使用== 来表示平等,而不是单个=。我的表达是[SomeNode == 'SomeValue'],但应该是[SomeNode = 'SomeValue']

    【讨论】:

      【解决方案3】:

      我得到这个是因为我偶然在 Xpath 的末尾有 //

      不正确

      table.SelectNodes(".//tr[1]//td[1]//");

      正确

      table.SelectNodes(".//tr[1]//td[1]");

      【讨论】:

        【解决方案4】:

        在我的例子中,我在我的一个配置 xml 中注释了一个 node1 标记以进行调试。所以它抛出了这个错误。

        我刚刚删除了不需要的节点标签。它奏效了。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-05-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-04-29
          • 2020-07-13
          • 1970-01-01
          相关资源
          最近更新 更多