1

だから私はこのようなXMLドキュメントを持っています:

<?xml version="1.0" encoding="UTF-8"?>
<gesmes:Envelope xmlns:gesmes="http://www.gesmes.org/xml/2002-08-01" xmlns="http://www.ecb.int/vocabulary/2002-08-01/eurofxref">
   <gesmes:subject>Reference rates</gesmes:subject>
   <gesmes:Sender>
       <gesmes:name>European Central Bank</gesmes:name>
   </gesmes:Sender>
   <Cube>
       <Cube time="2010-05-28">
           <Cube currency="USD" rate="1.2384"/>
           <Cube currency="JPY" rate="113.06"/>
       </Cube>
       <Cube time="2010-05-27">
           <Cube currency="USD" rate="1.2255"/>
           <Cube currency="JPY" rate="110.79"/>
       </Cube>
   </Cube>
</gesmes:Envelope>

ここで、ノードをXmlNode timeNode指すが、ロードされたXMLドキュメントを指すがあるとします。メソッドを呼び出して、ノードの属性の値を取得する必要があるとします。<Cube time="2010-05-28">documentrate<Cube currency=USD" rate="1.2384"/>SelectSingleNode(string xpath)

これまでのところ、私はこのコードを思い付くことができました:

XmlNamespaceManager nsmgr = new XmlNamespaceManager(document.NameTable);
nsmgr.AddNamespace("ecb", "http://www.ecb.int/vocabulary/2002-08-01/eurofxref");
nsmgr.AddNamespace("gesmes", "http://www.gesmes.org/xml/2002-08-01");


XmlNode currencyNode = timeNode.SelectSingleNode("descendant::ecb:Cube[@ecb:currency='USD']", nsmgr);

string rate = currencyNode.Attributes.GetNamedItem("rate").Value;

ここでの問題は、ここでcurrencyNodenullに設定されていることです。を確認したtimeNodeところ、正しいノードを指しているので、問題はSelectSingleNodeメソッドのパスにあると思いますが、問題がどこにあるのかわかりません。同様の問題を抱えている他の投稿を確認しましたが、地雷を解決するものは見つかりませんでした。任意のポインタをいただければ幸いです。

4

2 に答える 2

2

xpathをに変更します

descendant::ecb:Cube[@currency="USD"]
于 2010-08-01T13:31:14.077 に答える
1

XML属性にはデフォルトで名前空間がないため、名前空間プレフィックスを使用する必要はありません。試してみてください:

XmlNode currencyNode = timeNode.SelectSingleNode("descendant::ecb:Cube[@currency='USD']", nsmgr);

また、デフォルトで子を参照するため、ここで子孫軸を明示的に指定する必要はありません。したがって、次のように短縮することもできます。

XmlNode currencyNode = timeNode.SelectSingleNode("ecb:Cube[@currency='USD']", nsmgr);
于 2010-08-01T13:22:28.377 に答える