我正在尝试将
XML字符串解析为列表,结果计数始终为零.
string result = ""; string address = "http://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml"; // Create the web request HttpWebRequest request = WebRequest.Create(address) as HttpWebRequest; // Get response using (HttpWebResponse response = request.GetResponse() as HttpWebResponse) { // Get the response stream StreamReader reader = new StreamReader(response.GetResponseStream()); // Read the whole contents and return as a string result = reader.ReadToEnd(); } XDocument doc = XDocument.Parse(result); var ListCurr = doc.Descendants("Cube").Select(curr => new CurrencyType() { Name = curr.Element("currency").Value,Value = float.Parse(curr.Element("rate").Value) }).ToList();
哪里出错了
解决方法
问题是你正在寻找没有命名空间的元素,而XML在根元素中包含这个元素:
xmlns="http://www.ecb.int/vocabulary/2002-08-01/eurofxref"
这指定了任何元素的默认命名空间.此外,货币和汇率是多维数据集元素中的属性 – 它们不是子元素.
所以你想要这样的东西:
XNamespace ns = "http://www.ecb.int/vocabulary/2002-08-01/eurofxref"; var currencies = doc.Descendants(ns + "Cube") .Select(c => new CurrencyType { Name = (string) c.Attribute("currency"),Value = (decimal) c.Attribute("rate") }) .ToList();
请注意,因为我将货币属性转换为字符串,所以对于未指定该属性的任何货币,您最终将使用null Name属性.如果要跳过这些元素,可以在Select之前或之后使用Where子句.
另请注意,我已将Value的类型更改为decimal而不是float – 您不应将float用于与货币相关的值. (有关详细信息,请参阅this question.)
此外,您应该考虑使用XDocument.Load
加载XML:
XDocument doc = XDocument.Load(address);
然后就不需要自己创建WebRequest等了.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。