1. ホーム
  2. c#

[解決済み] "式はノードセットとして評価されなければならない"

2022-02-08 05:32:42

質問

問題があります

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

式はノードセットとして評価されなければなりません。

どのように解決するのですか?

エラーの理由

エラーメッセージの通りです。 .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 パーススタックを XmlDocument から Linq to Xml XDocument があります。 より簡潔な方法 を使用してスカラー式を評価します。

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 (などの通貨用の変数と思われる)。 USD )