所以我试图解析一些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字符。 (唯一的疑难杂症有可能是<
属性里面的人物,因为他们没有在那里躲过千万-只>
。字符做)