使用元素名称中的空格解析XML
所以我必须解析一个简单的XML文件(只有一个级别,没有属性,只有元素和值),但问题是XML中存在(或可能存在)空格。我知道这很糟糕(可能很糟糕)的做法,但我不是那种构建XML的人,而是来自外部库。使用元素名称中的空格解析XML
例如:
<live key>test</live key> <not live>test</not live> <Test>hello</Test>
现在我的策略是在同一时间读取XML(我把它作为一个字符串)一个字符,只是保存每个元素的名称和值,因为我得到对它来说,但这似乎有点太复杂。
有没有更简单的方法来做到这一点? XMLReader
会引发错误,因为它认为XML是格式良好的,因此它认为“活”是元素名称,“键”是属性,因此它试图查找“=”并获取“>” 。
不幸的是,由库返回的文本不是格式良好的XML,因此您不能使用XML解析器来解析它。标签中的空间只是问题的一部分,还有其他问题,例如缺少“根”标签。
幸运的是,单层语言足够微不足道,无法与正则表达式匹配。基于正则表达式,“解析器”将是真正的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'
谢谢,这非常有帮助 – 2014-10-08 17:54:43
由于它是一个扁平的结构也许可以帮助:
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));
}
所以,你得到的“键 - 值”对的列表。跟踪仅用于检查结果
个人而言,我会尝试删除或替换所有空格,然后加载XML。但这也可能是棘手的。 – juharr 2014-10-08 15:57:24
我会发送一封措辞强烈的信给谁管理这个库 – Jonesopolis 2014-10-08 16:00:14
不幸的是,空格使输入不是一个格式良好的XML,这意味着没有标准的解析器将采取这种;基本上,你是独立的。这太可怕了 - 试着说服你的第三方图书馆的作家来解决这个问题。如果他们仍然在附近,他们应该明白为什么。 – dasblinkenlight 2014-10-08 16:00:56