我遇到了问题
我的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('.', ','));
表达式必须求值为节点集
答案 0 :(得分:14)
错误原因
根据错误消息,.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)");
错误:表达式必须求值为节点集。
而不是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!}");
错误:表达式必须求值为节点集。
OP的问题
您的Xpath中有错误。您可能想要的是:
doc.SelectNodes("//ALTINKAYNAK/DOVIZ[ADI='" + dovizKuru2 + "']/ALIS") // ...
将返回ALIS
元素的DOVIZ
子元素,该元素的ADI
子元素值为dovizKuru2
(可能是货币的变量,例如{ {1}})
答案 1 :(得分:0)
我收到此错误,因为我的Xpath表达式无效。我使用umount /var/lib/docker/overlay2-legacy/*/merged
rm -R /var/lib/docker/overlay2-legacy/*
来实现平等,而不是使用单个==
。我的表情是=
,但应该是[SomeNode == 'SomeValue']
。
答案 2 :(得分:0)
我得到这个是因为我在 Xpath 的末尾有 LAT LON R
0 89 0 0.01
1 89 1 0.01
2 89 2 0.02
3 89 3 0.01
4 89 4 0.00
5 88 0 0.01
6 88 1 0.00
7 88 2 0.00
8 88 3 0.01
9 88 4 0.00
10 87 0 0.00
11 87 1 0.02
12 87 2 0.01
13 87 3 0.02
14 87 4 0.01
15 86 0 0.02
16 86 1 0.00
17 86 2 0.03
18 86 3 0.02
19 86 4 0.00
20 85 0 0.00
21 85 1 0.00
22 85 2 0.00
23 85 3 0.01
24 85 4 0.03
。
不正确
//
正确
table.SelectNodes(".//tr[1]//td[1]//");
答案 3 :(得分:0)
就我而言,我在我的一个配置 xml 中注释了一个 node1 标记以进行调试。所以它抛出了这个错误。
我刚刚删除了不需要的节点标签。成功了。