"表达式必须评估为节点集."

ofi*_*nce 8 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>
Run Code Online (Sandbox Code Playgroud)

我如何解析这个XML文件

我编码的方式,但我得到一个解析错误信息;

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

表达式必须求值为节点集

Stu*_*tLC 17

错误原因

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

var nodeSet = document.SelectNodes("/altinkaynak/DOVIZ");
Run Code Online (Sandbox Code Playgroud)

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

var nodeSet = document.SelectNodes("(/altinkaynak/DOVIZ)[1]");
Run Code Online (Sandbox Code Playgroud)

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

var nodeSet = document.SelectNodes("count(/altinkaynak/DOVIZ)");
Run Code Online (Sandbox Code Playgroud)

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

相反XmlDocument,您需要创建导航器,编译表达式并对其进行评估:

 var navigator = document.CreateNavigator();
 var expr = navigator.Compile("count(/altinkaynak/DOVIZ)");
 var count = navigator.Evaluate(expr); // 3 (nodes)
Run Code Online (Sandbox Code Playgroud)

如果将Xml解析堆栈从使用转换XmlDocument为a Linq to Xml XDocument,则有一种更简洁的方法来评估标量表达式:

var count = xele.XPathEvaluate("count(/altinkaynak/DOVIZ)");
Run Code Online (Sandbox Code Playgroud)

形成错误的Xpath

Expression must evaluate to a node-set对于xpath完全无效的s,也经常返回相同的error()

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

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

OP的问题

您的Xpath中有错误.你可能想要的是这个:

doc.SelectNodes("//ALTINKAYNAK/DOVIZ[ADI='" + dovizKuru2 + "']/ALIS") // ...
Run Code Online (Sandbox Code Playgroud)

这将返回具有值为的子元素的ALISDOVIZ元素(可能是货币的变量,如)ADIdovizKuru2USD

  • 实际上`Some/Really = badly [@ formed ='xpath']`在语法上是有效的并返回一个布尔值.如果用"A/B = C [@ X = 3]"替换它,你会发现它非常有意义. (3认同)