私は問題があります
私の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は、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
に切り替えると、スカラー式を評価するための はるかに簡潔な方法 があります。
var count = xele.XPathEvaluate("count(/altinkaynak/DOVIZ)");
不正に形成されたXpath
これと同じエラー(Expression must evaluate to a node-set
)は、完全に無効なxpath
sに対しても頻繁に返されます。
var nodeSet = document.SelectNodes("{Insert some really badly formed xpath here!}");
エラー:式はノードセットに評価される必要があります。
OPの質問
Xpathにエラーがあります。あなたがおそらく欲しいのはこれです:
doc.SelectNodes("//ALTINKAYNAK/DOVIZ[ADI='" + dovizKuru2 + "']/ALIS") // ...
これは、値がdovizKuru2
のALIS
子を持つDOVIZ
要素のADI
子を返します(これはおそらくUSD
などの通貨の変数です)