2014-10-08 45 views
4

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

例如:

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

现在我的策略是在同一时间读取XML(我把它作为一个字符串)一个字符,只是保存每个元素的名称和值,因为我得到对它来说,但这似乎有点太复杂。

有没有更简单的方法来做到这一点? XMLReader会引发错误,因为它认为XML是格式良好的,因此它认为“活”是元素名称,“键”是属性,因此它试图查找“=”并获取“>” 。

+0

个人而言,我会尝试删除或替换所有空格,然后加载XML。但这也可能是棘手的。 – juharr 2014-10-08 15:57:24

+2

我会发送一封措辞强烈的信给谁管理这个库 – Jonesopolis 2014-10-08 16:00:14

+1

不幸的是,空格使输入不是一个格式良好的XML,这意味着没有标准的解析器将采取这种;基本上,你是独立的。这太可怕了 - 试着说服你的第三方图书馆的作家来解决这个问题。如果他们仍然在附近,他们应该明白为什么。 – dasblinkenlight 2014-10-08 16:00:56

回答

3

不幸的是,由库返回的文本不是格式良好的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' 
+0

谢谢,这非常有帮助 – 2014-10-08 17:54:43

1

由于它是一个扁平的结构也许可以帮助:

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)); 
    } 

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