在 C# 中使用重复的元素名分析 XML

本文关键字:元素 XML | 更新日期: 2023-09-27 18:33:15

我正在尝试在 C# 中解析以下 XML 结构。我想创建一个包含货币的列表>。

<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,但它没有返回任何内容。我猜这与立方体元素在多个级别中使用的事实有关。

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 结构以获取货币?

在 C# 中使用重复的元素名分析 XML

你的代码有两个问题

  • 每个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"));

PS:您不必显式解析rate。这可以通过 casting

您必须添加一个命名空间(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
                 };

以这个答案作为参考

相关文章: