2

C# で次の XML 構造を解析しようとしています。通貨で List> を作成したい。

<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="2013-09-27">
    <Cube currency="USD" rate="1.3537"/>
    <Cube currency="JPY" rate="133.28"/>
    <Cube currency="BGN" rate="1.9558"/>
    <Cube currency="CZK" rate="25.690"/>
    <Cube currency="DKK" rate="7.4573"/>
    (....)

XDocument.Descendants を使用してみましたが、何も返されません。Cube要素がいくつかのレベルで使用されているという事実と関係があると思います.

XDocument xdoc = XDocument.Parse(xml);
var currencies = from cube in xdoc.Descendants("Cube")
                    select new
                        {
                            Currency = cube.Attribute("currency").Value,
                            Rate = cube.Attribute("rate").Value
                        };

foreach (var currency in currencies)
    this.Add(new KeyValuePair<string, double>(currency.Currency, Convert.ToDouble(currency.Rate)));

XML 構造を解析して通貨を取得するにはどうすればよいですか?

4

3 に答える 3

3

あなたのコードには2つの問題があります

  • すべてがand属性Cubeを持っていませんcurrencyrate
  • Xml 名前空間を無視する

コードに従って辞書を作成したいようです:

XNamespace ns = "http://www.ecb.int/vocabulary/2002-08-01/eurofxref";
var xDoc = XDocument.Load(fname);

var dict = xDoc.Descendants(ns + "Cube")
               .Where(cube => cube.Attributes().Any(a => a.Name == "currency"))
               .ToDictionary(cube => cube.Attribute("currency").Value,
                             cube => (decimal)cube.Attribute("rate"));

ratePS: を明示的に解析する必要はありません。キャストすることでxmlを読みながら行うことができます

于 2013-09-28T21:39:30.010 に答える
1

xdoc.XPathSelectElements("//Cube/Cube/Cube[@name='currency']") を試してください

于 2013-09-28T21:13:38.963 に答える
1

名前空間を追加する必要があり (Cube 要素はデフォルトの空の名前空間にはありません)、Cube 要素に実際に currency 属性があるかどうかを確認する必要があります。

これは、動作する現在のコードに最も近いソリューションです。

XDocument xdoc = XDocument.Parse(xml);
XNamespace nsSys = "http://www.ecb.int/vocabulary/2002-08-01/eurofxref";

var currencies = from cube in xdoc.Descendants(nsSys+ "Cube")
                 where cube.Attribute("currency") !=null
                 select new
                 {
                      Currency = cube.Attribute("currency").Value,
                      Rate = cube.Attribute("rate").Value
                 };

この回答を参照として使用しました

于 2013-09-28T21:14:46.633 に答える