“表达式必须评估为节点集。”

时间:2013-07-24 16:40:48

标签: c# xml xpath

我遇到了问题

我的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('.', ','));
  

表达式必须求值为节点集

4 个答案:

答案 0 :(得分:14)

错误原因

根据错误消息,.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)也经常为xpath返回,这些错误完全无效

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

错误:表达式必须求值为节点集。

OP的问题

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

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

将返回ALIS元素的DOVIZ子元素,该元素的ADI子元素值为dovizKuru2(可能是货币的变量,例如{ {1}})

答案 1 :(得分:0)

我收到此错误,因为我的Xpath表达式无效。我使用umount /var/lib/docker/overlay2-legacy/*/merged rm -R /var/lib/docker/overlay2-legacy/* 来实现平等,而不是使用单个==。我的表情是=,但应该是[SomeNode == 'SomeValue']

答案 2 :(得分:0)

我得到这个是因为我在 Xpath 的末尾有 LAT LON R 0 89 0 0.01 1 89 1 0.01 2 89 2 0.02 3 89 3 0.01 4 89 4 0.00 5 88 0 0.01 6 88 1 0.00 7 88 2 0.00 8 88 3 0.01 9 88 4 0.00 10 87 0 0.00 11 87 1 0.02 12 87 2 0.01 13 87 3 0.02 14 87 4 0.01 15 86 0 0.02 16 86 1 0.00 17 86 2 0.03 18 86 3 0.02 19 86 4 0.00 20 85 0 0.00 21 85 1 0.00 22 85 2 0.00 23 85 3 0.01 24 85 4 0.03

不正确

//

正确

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

答案 3 :(得分:0)

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

我刚刚删除了不需要的节点标签。成功了。