使用带引号的属性解析XML

时间:2017-10-02 20:08:46

标签: c# .net parsing xml-parsing

我正在使用第三方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" />

1 个答案:

答案 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()
};