使用元素名称中的空格解析XML

时间:2014-10-08 15:51:31

标签: c# xml xml-parsing

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

示例:

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

现在我的策略是一次读取一个字符的XML(我把它作为一个字符串),然后保存每个元素名称和值,但这看起来有点太复杂。

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

2 个答案:

答案 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;对。跟踪仅用于检查结果