2013-07-24 25 views
5

我遇到问题“表达式必须评估为节点集。”

我的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

回答

12

原因错误

按照该错误消息,.SelectNodes()要求xpath字符串参数计算结果为节点集,例如这个XPath将返回XmlNodeList含有3个节点:

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) 

如果您使用XmlDocumentLinq to XmlXDocument切换你的XML解析栈有一个much more concise way评估标量表达式:

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

严重形成的Xpath

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

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") // ... 

这将返回ALIS孩子拥有一个ADI孩子的dovizKuru2的值DOVIZ元素(这大概是货币变量如USD

+0

它作品。谢谢。 – ofince

+2

实际上'Some/Really = badly [@ formed ='xpath']'在语法上是有效的并且返回一个布尔值。如果你用'A/B = C [@ X = 3]'替换它,你可以看到它非常有意义。 –

+0

谢谢@MichaelKay - 已更新 – StuartLC