如何解析XML随着节点名称无效字符?(How To Parse XML With Invalid C

2019-09-17 09:40发布

所以我试图解析一些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阅读器类在看到这些字符不是吓坏了,或动态逃脱他们的东西? 我可以做一些预处理对整个文件,但如果它们出现在某些有效的方式在节点内我确实想在“(”和“)”字符,所以我不想只是将它们全部删除。 ..

Answer 1:

这根本是无效的。 预处理是你最好的下注,也许正则表达式 - 是这样的:

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


Answer 2:

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

XML是非常严格的关于这一点。

如果你不能得到发送应用程序发送正确的XML,然后才让他们知道, 无论下游工艺看到这个会失败 ,无论是你的还是在将来的某个其他应用程序。

如果预处理是不是一种选择,另一种巧妙的机制来包装Stream传递到与自定义流的解析器对象。 该流可以寻找<字符,当它看到一个,设置一个标志。 直到>字符是看到,它可能吃任何()字符。 我们使用了这样的事情来摆脱NUL构成,并通过传统传输机制加入到一个XML文件^ Z字符。 (唯一的疑难杂症有可能是<属性里面的人物,因为他们没有在那里躲过千万-只> 。字符做)



文章来源: How To Parse XML With Invalid Characters in Node Name?