web-dev-qa-db-ja.com

「式はノードセットに評価される必要があります。」

私は問題があります

私の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('.', ','));

式はノードセットに評価される必要があります

8
ofince

エラーの理由

エラーメッセージのとおり、.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 XmlXDocumentに切り替えると、スカラー式を評価するための はるかに簡潔な方法 があります。

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

不正に形成されたXpath

これと同じエラー(Expression must evaluate to a node-set)は、完全に無効なxpathsに対しても頻繁に返されます。

 var nodeSet = document.SelectNodes("{Insert some really badly formed xpath here!}");

エラー:式はノードセットに評価される必要があります。

OPの質問

Xpathにエラーがあります。あなたがおそらく欲しいのはこれです:

doc.SelectNodes("//ALTINKAYNAK/DOVIZ[ADI='" + dovizKuru2 + "']/ALIS") // ...

これは、値がdovizKuru2ALIS子を持つDOVIZ要素のADI子を返します(これはおそらくUSDなどの通貨の変数です)

17
StuartLC