【问题标题】:Parsing XML with spaces in element names [duplicate]使用元素名称中的空格解析 XML [重复]
【发布时间】:2014-10-08 15:51:30
【问题描述】:

所以我必须解析一个简单的 XML 文件(只有一层,没有属性,只有元素和值),但问题是 XML 中有(或可能有)空格。我知道这是不好(可能很糟糕)的做法,但我不是构建 XML 的人,它来自外部库。

示例:

<live key>test</live key>
<not live>test</not live>
<Test>hello</Test>  

现在我的策略是一次读取一个字符的 XML(我将它作为一个字符串),并在我得到它时保存每个元素的名称和值,但这似乎有点太复杂了。

有没有更简单的方法? XMLReader 会抛出一个错误,因为它认为 XML 格式正确,因此它认为“live”是元素名称,而“key”是一个属性,所以它试图寻找一个“=”并得到一个“ >”。

【问题讨论】:

  • 我个人会尝试删除或替换所有空格,然后加载 xml。但这也可能很棘手。
  • 我会向管理这个图书馆的人发送一封措辞强硬的信
  • 不幸的是,空格使输入不是格式良好的 XML,这意味着没有标准解析器会接受它;本质上,你是一个人。这太糟糕了 - 尝试说服您的 3-rd 方库的作者来解决这个问题。如果他们还在,他们应该明白为什么。
  • 您是否有所有可能包含空格的标签的列表,或者该列表是动态的?
  • 为什么将其称为 XML?它不是那种东西。如果您的数据供应商想要发明一种自定义的非标准 XML 变体,则需要有人为其编写解析器。这是一个很大的努力,我不明白为什么有人愿意这样做。

标签: c# xml xml-parsing


【解决方案1】:

很遗憾,您的库返回的文本不是格式良好的 XML,因此您不能使用 XML 解析器来解析它。标签中的空格只是问题的一部分;还有其他问题,例如“root”标签的缺失。

幸运的是,单级语言很简单,可以与正则表达式匹配。基于正则表达式的“解析器”对于真正的 XML 来说是一个糟糕的选择,但这种语言不是真正的,所以您至少可以使用正则表达式作为一种解决方法:

Regex rx = new Regex("<([^>\n]*)>(.*?)</(\\1)>");
var m = rx.Match(text);
while (m.Success) {
    Console.WriteLine("{0}='{1}'", m.Groups[1], m.Groups[2]);
    m = m.NextMatch();
}

这种方法背后的想法是找到带有“开始标签”的字符串,这些字符串与带有斜线的“结束标签”匹配。

这是一个demo,它会为您的输入生成以下输出:

live key='test'
not live='test'
Test='hello'

【讨论】:

  • 谢谢,这很有帮助
【解决方案2】:

因为它是一个扁平的结构,可能会有所帮助:

    MatchCollection ms = Regex.Matches(xml, @"\<([\w ]+?)\>(.*?)\<\/\1\>");

    foreach (Match m in ms)
    {
        Trace.WriteLine(string.Format("{0} - {1}", m.Groups[1].Value, m.Groups[2].Value));
    }

所以你会得到一个“键值”对的列表。跟踪仅用于检查结果

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多