所以我必须解析一个简单的XML文件(只有一个级别,没有属性,只有元素和值),但问题是XML中有(或可能是)空格。我知道这很糟糕(可能很糟糕)的做法,但我不是那个正在构建XML的人,而是来自外部库。
示例:
<live key>test</live key> <not live>test</not live> <Test>hello</Test>
现在我的策略是一次读取一个字符的XML(我把它作为一个字符串),然后保存每个元素名称和值,但这看起来有点太复杂。
有没有更简单的方法呢? XMLReader
会抛出一个错误,因为它认为XML格式正确,因此它认为“live”是元素名称而“key”是一个属性,因此它试图寻找“=”并得到一个“&gt;”。
答案 0 :(得分:3)
不幸的是,库返回的文本不是格式良好的XML,因此您无法使用XML解析器来解析它。标签中的空格只是问题的一部分;还有其他问题,例如,缺少&#34; root&#34;标签
幸运的是,单级语言足以与正则表达式匹配。基于正则表达式的&#34;解析器&#34;对于真正的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();
}
这种方法背后的想法是找到带有&#34;开启标签的字符串&#34;匹配&#34;结束标签&#34;用斜线。
这是demo,它会为您的输入生成以下输出:
live key='test'
not live='test'
Test='hello'
答案 1 :(得分: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));
}
因此,您会获得一个&#39;键值&#39;对。跟踪仅用于检查结果