正在分析元素名称中包含空格的XML
本文关键字:包含 空格 XML 元素 | 更新日期: 2023-09-27 18:26:01
所以我必须解析一个简单的XML文件(只有一个级别,没有属性,只有元素和值),但问题是XML中存在(或可能存在)空间。我知道这是一种糟糕(可能很糟糕)的做法,但我不是构建XML的人,它来自外部库。
示例:
<live key>test</live key> <not live>test</not live> <Test>hello</Test>
现在,我的策略是一次读取XML(我把它作为一个字符串)一个字符,并在访问时保存每个元素的名称和值,但这似乎有点太复杂了。
有什么更简单的方法吗?XMLReader
会抛出一个错误,因为它认为XML格式正确,因此它认为"live"是元素名称,"key"是属性,所以它试图查找一个"="并得到一个">"。
遗憾的是,库返回的文本不是格式良好的XML,因此无法使用XML解析器对其进行解析。标记中的空格只是问题的一部分;还有其他问题,例如,缺少"root"标记。
幸运的是,单级语言非常琐碎,可以与正则表达式相匹配。对于真正的XML来说,基于Regex的"解析器"将是一个糟糕的选择,但这种语言不是真实的,所以您可以使用Regex至少作为一种变通方法:
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();
}
这种方法背后的思想是找到带有"开始标记"的字符串,这些字符串与带有斜线的"结束标记"相匹配。
这是一个演示,它为您的输入生成以下输出:
live key='test'
not live='test'
Test='hello'
由于它是一个平面结构,这可能会有所帮助:
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));
}
所以你得到了一个"键值"对的列表。痕迹仅用于检查结果