3

所以我试图解析一些 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 类在看到这些字符时不会惊慌失措,或者动态地逃避它们或其他什么?我可以对整个文件进行某种预处理,但如果 '(' 和 ')' 字符以某种有效方式出现在节点内,我确实想要它们,所以我不想将它们全部删除。 ..

4

2 回答 2

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;
    });
于 2009-07-01T13:25:19.650 回答
3

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

XML 对此非常严格。

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

如果预处理不是一个选项,另一种巧妙的机制是Stream使用自定义流包装传递给解析器的对象。该流可以查找<字符,当它看到一个字符时,设置一个标志。在看到一个>角色之前,它可以吃掉任何一个(或多个)角色。我们已经使用类似这样的方法来消除通过旧传输机制添加到 XML 文件中的 NUL 和 ^Z 字符。(唯一的问题是属性内可能有<字符,因为它们不必在那里转义 - 只有>字符可以。)

于 2009-07-01T13:28:21.250 回答