如何解析节点名称中无效字符的XML?

所以我试图解析一些XML,其创建不受我的控制。 问题是,他们以某种方式获得了如下所示的节点:

      

Visual Studio和.NET都认为上面使用的’(’和’)’字符完全无效。 不幸的是,我需要处理这些文件! 有没有办法让Xml Reader类看到这些字符,或动态地逃避它们或其他东西? 我可以对整个文件进行某种预处理,但如果它们以某种有效的方式出现在节点内,我想要’(’和’)’字符,所以我不想只删除它们。 ..

这根本无效。 预处理是你最好的选择,也许是正则表达式 – 类似于:

 string output = Regex.Replace(input, @"(<\w+)\((\w+)\)([ >/])", "$1$2$3"); 

编辑:在括号内替换“ – ”有点复杂:

 string output = Regex.Replace(input, @"(<\w+)\(([-\w]+)\)([ >/])", delegate(Match match) { return match.Groups[1].Value + match.Groups[2].Value.Replace('-', '_') + match.Groups[3].Value; }); 

如果它在语法上不合法,那么它不是XML。

XML对此非常严格。

如果你无法让发送应用程序发送正确的XML,那就让他们知道无论下游进程看到什么 都会失败 ,无论是你的还是其他应用程序。

如果预处理不是一个选项,另一个聪明的机制是使用自定义流包装传递给解析器的Stream对象。 该流可以查找<字符,当它看到一个时,设置一个标志。 在看到>字符之前,它可以吃任何()字符。 我们使用这样的东西来摆脱传统传输机制添加到XML文件中的NUL和^ Z字符。 (唯一的问题可能是<属性中的字符,因为它们不必在那里转义 - 只有>字符。)