17

我有个问题

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

表达式必须计算为节点集

4

4 回答 4

25

错误原因

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

错误:表达式必须计算为节点集。

取而代之的是XmlDocument,您需要创建一个导航器、编译一个表达式并对其进行评估:

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

如果您将 Xml 解析堆栈从 using 切换XmlDocument到 a Linq to Xml XDocument,则有一种更简洁的方法来评估标量表达式:

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

格式错误的 Xpath

对于完全无效Expression must evaluate to a node-set的 s 也经常返回相同的错误 ( )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(可能是货币的变量,例如USD

于 2013-07-24T16:47:15.827 回答
1

我收到此错误是因为我的 Xpath 表达式无效。我使用==的是平等而不是单个=. 我的表情是[SomeNode == 'SomeValue']但应该是[SomeNode = 'SomeValue']

于 2020-11-06T23:00:01.743 回答
0

我得到这个是因为我//偶然在我的 Xpath 结束时遇到了这个问题。

不正确

table.SelectNodes(".//tr[1]//td[1]//");

正确的

table.SelectNodes(".//tr[1]//td[1]");

于 2021-06-12T23:37:11.497 回答
0

就我而言,我在我的一个配置 xml 中注释了一个 node1 标记以进行调试。所以它抛出了这个错误。

我刚刚删除了不需要的节点标签。有效。

于 2021-07-23T09:14:08.930 回答