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

有帮助吗?

解决方案

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

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对象。该流可以寻找<字符,当它看到一个,设置一个标志。直到>字符是看到,它可能吃任何()字符。我们使用了这样的事情来摆脱NUL构成,并通过传统传输机制加入到一个XML文件^ Z字符。 (属性的内部唯一疑难杂症有可能被<字符,因为它们不必须存在逃脱 - 只有>字符做)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top