【发布时间】:2020-01-20 14:10:43
【问题描述】:
我正在从一个返回对象数组的 Web 服务解析 XML 文档。
一个对象的字段包含浮点值,它看起来像这样:
<Valute ID="R01010">
<NumCode>036</NumCode>
<CharCode>AUD</CharCode>
<Nominal>1</Nominal>
<Name>Australian Dollar</Name>
<Value>14,4200</Value>
</Valute>
我成功地将文档读入XDocument 对象,如下所示:
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
using (var sr = new System.IO.StreamReader(response.GetResponseStream(), Encoding.GetEncoding(response.CharacterSet)))
{
XDocument xmlDoc = new XDocument();
try
{
xmlDoc = XDocument.Parse(sr.ReadToEnd());
DesiredDate = DateTime.ParseExact(xmlDoc.Element("ValCurs").Attribute("Date").Value, "dd.MM.yyyy", new CultureInfo("ru-RU"));
result = new List<CBRItem>();
foreach (var valuteElement in xmlDoc.Element("ValCurs").Elements("Valute"))
{
CBRItem item = CBRItem.FromXElement(valuteElement);
if (item != null)
{
result.Add(item);
}
else
{
Console.WriteLine("Could not convert from Valute XML element:\n" + valuteElement.ToString());
}
}
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
}
我像这样处理数组中的每个对象:
public static CBRItem FromXElement(XElement elem)
{
CBRItem result = new CBRItem();
try
{
result.ID = elem.Attribute("ID").Value;
result.NumCode = elem.Element("NumCode").Value;
result.CharCode = elem.Element("CharCode").Value;
result.Nominal = short.Parse(elem.Element("Nominal").Value, new CultureInfo("ru-RU"));
result.Name = elem.Element("Name").Value;
result.Value = decimal.Parse(elem.Element("Value").Value, new CultureInfo("ru-RU"));
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
return result;
}
我已经调试了我的代码,并验证了我传递给FromXElement 函数的XElement 对象填充了适当的数据(如开头所述)。
但我在 decimal 解析行上得到了一个 System.FormatException
result.Value = decimal.Parse(elem.Element("Value").Value, new CultureInfo("ru-RU"));
在某些 PC 上,但不是我的或我工作的那台。
这真的很奇怪,我什至指定了文化,以消除由于NumberDecimalSeparator 在当前文化中不是逗号而可能发生的解析错误。 (文化是ru-RU,因为网络服务是俄语,我认为在这种情况下这是合适的选择)
那么,是什么导致了这个问题?
【问题讨论】:
-
你认为
14,4200会怎样出现?如果“,”是小数,那么它将是 14,42 - 到目前为止一切都很好。但如果它明确不是小数,那么它是什么? 1000 年 9 月?那么应该是144,200... -
@Fildor,网络服务使用
,作为小数分隔符 -
啊,那我误会最后一段了,抱歉。
-
它使用 1000-sep 吗? API 是否有文档,说明在哪里,它到底是什么文化?
-
@Fildor 不,我找不到有关 1000 年 sep 或文化的任何信息。实际上,这是服务示例:cbr.ru/scripts/XML_daily.asp?date_req=21/11/2000
标签: c# .net parsing xml-parsing