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

时间:2009-07-01 13:23:06

标签: c# .net xml parsing invalid-characters

所以我试图解析一些XML,其创建不受我的控制。麻烦的是,他们以某种方式获得了这样的节点:

<ID_INTERNAL_FEAT_FOCUSED_EXPERTISE_(MORNINGSTAR) />
<ID_INTERNAL_FEAT_FOCUSED_EXPERTISE_(QUARTERSTAFF) />
<ID_INTERNAL_FEAT_FOCUSED_EXPERTISE_(SCYTHE) />
<ID_INTERNAL_FEAT_FOCUSED_EXPERTISE_(TRATNYR) />
<ID_INTERNAL_FEAT_FOCUSED_EXPERTISE_(TRIPLE-HEADED_FLAIL) />
<ID_INTERNAL_FEAT_FOCUSED_EXPERTISE_(WARAXE) />

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

2 个答案:

答案 0 :(得分:8)

这根本无效。预处理是你最好的选择,也许是正则表达式 - 比如:

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

答案 1 :(得分:3)

如果语法无效,则不是XML。

XML对此非常严格。

如果你无法让发送应用程序发送正确的XML,那就让他们知道无论下游进程看到将失败,无论是你的还是某些未来的其他应用程序。

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