【问题标题】:Parse XML with quoted attributes使用带引号的属性解析 XML
【发布时间】:2026-02-12 14:55:01
【问题描述】:

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

【问题讨论】:

  • 所以这是您无法控制的属性?双双引号总是存在吗?您还需要每个数字吗?
  • 该属性来自第 3 方服务器生成的文本文件 - 那里没有访问权限。双引号不在原始文件中,它似乎是调试器输出中发生的事情?我确实需要每个数字,我应该取回两个项目,第二个是整个 Amounts= 字符串
  • 它是有效的 xml。您(必须?)使用的解析器很糟糕。为什么不使用 .net 的普通 xml 功能(如 xmlserializer)...?

标签: c# .net parsing xml-parsing


【解决方案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()
};

【讨论】: