我正在尝试在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结构以获取货币?
答案 0 :(得分:3)
您的代码存在两个问题
Cube
都没有currency
和rate
属性因为您似乎想根据您的代码创建字典:
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
。可以在通过强制转换
答案 1 :(得分:1)
尝试xdoc.XPathSelectElements(“// Cube / Cube / Cube [@ name ='currency']”)
答案 2 :(得分:1)
您必须添加命名空间(Cube元素不在默认的空命名空间中),您必须检查Cube元素是否确实具有货币属性。
这是最接近您的解决方案的解决方案:
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
};