我正在使用第三方XML解析器(不是我的决定),并发现它做了一件坏事。这是XML标记的内部部分:
"Date=""2014-01-01"" Amounts=""100717.72 100717.72 100717.72 100717.72"""
要解析属性,代码会在空格上执行.split
,忽略引号。只要没有带空格的字符串,这就可以正常工作,但我们就是这样。它返回正确的Date = 2014-01-01和半适当的Amounts = 100717.72,然后再输入四个数字。
我有解析器的C#代码,并考虑用其他字符替换空格内部引号,拆分并更改它们。但后来我想我应该先问一下。
有没有办法将此文本正确解析为两个条目?
更新:跟随原始XML(从另一台计算机输入,原谅我!)
<DetailAmounts Date="2014-01-01" Amounts="100717.72 100717.72 100717.72 100717.72" />
答案 0 :(得分:1)
您应该使用XmlSerializer
反序列化数据:
public class DetailAmounts
{
[XmlAttribute]
public DateTime Date { get; set; }
[XmlAttribute]
public string Amounts { get; set; }
}
// ...
var xml = "<DetailAmounts Date=\"2014-01-01\" Amounts=\"100717.72 100717.72 100717.72 100717.72\" />";
var serializer = new XmlSerializer(typeof(DetailAmounts));
using (var reader = new StringReader(xml))
{
var detailAmounts = (DetailAmounts)serializer.Deserialize(reader);
}
或者,您可以使用XElement
来解析每个值:
var xml = "<DetailAmounts Date=\"2014-01-01\" Amounts=\"100717.72 100717.72 100717.72 100717.72\" />";
var element = XElement.Parse(xml);
var detailAmounts = new
{
Date = (DateTime)element.Attribute("Date"),
Amounts = element.Attribute("Amounts").Value.Split(' ')
.Select(x => decimal.Parse(x, CultureInfo.InvariantCulture))
.ToArray()
};