微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c# – “表达式必须评估为节点集.”

我有个问题

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

Expression must evaluate to a node-set

解决方法

错误原因

根据错误消息,.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)");

Error: Expression must evaluate to a node-set.

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

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

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

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

形成错误的Xpath

对于完全无效的xpath,也经常返回相同的错误(表达式必须计算到节点集)

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

Error: Expression must evaluate to a node-set.

OP的问题

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

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

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

原文地址:https://www.jb51.cc/csharp/98817.html

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

相关推荐