C# &引用;表达式必须计算为节点集;

C# &引用;表达式必须计算为节点集;,c#,xml,xpath,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.91

我有个问题

我的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>
表达式必须计算为节点集


错误原因

根据错误消息,
.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)");
var count = xele.XPathEvaluate("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
,则需要计算标量表达式:

var nodeSet = document.SelectNodes("count(/altinkaynak/DOVIZ)");
var count = xele.XPathEvaluate("count(/altinkaynak/DOVIZ)");
格式错误的Xpath

同样的错误(
表达式必须计算为一个节点集
)也经常为完全无效的
xpath返回

 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

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

我之所以得到这个表达式,是因为我在Xpath末尾意外地遇到了
/

不正确

table.SelectNodes(“.//tr[1]///td[1]//”

正确


table.SelectNodes(“.//tr[1]//td[1]”)

实际上
Some/Really=bally[@formed='xpath']
在语法上有效并返回布尔值。如果用
A/B=C[@X=3]
替换它,您会发现它非常有意义。