- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
我有一个问题
我的 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 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!}");
Error: Expression must evaluate to a node-set.
OP 的问题
您的 Xpath 有错误。您可能想要的是:
doc.SelectNodes("//ALTINKAYNAK/DOVIZ[ADI='" + dovizKuru2 + "']/ALIS") // ...
这将返回 DOVIZ
元素的 ALIS
子元素,该元素有一个 ADI
子元素,值为 dovizKuru2
(大概是货币的变量,例如 USD
)
关于c# - "Expression must evaluate to a node-set.",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17839989/
我是一名优秀的程序员,十分优秀!