9

我正在尝试在大量 XML 文件上使用 C# 的 XmlReader,除了少数选择的文件外,它们的格式都正确(不幸的是,我无法更改它们,因为它会破坏很多其他代码)。

这些错误仅来自这些冒犯性 XML 文件的一个特定部分,可以跳过它们,但我不想停止阅读 XML 文件的其余部分。

坏的部分是这样的:

 <InterestingStuff>
  ...
    <ErrorsHere OptionA|Something = "false" OptionB|SomethingElse = "false"/>
    <OtherInterestingStuff>
    ...
    </OtherInterestingStuff>
</InterestingStuff>

所以真的,如果我可以忽略无效标签,或者忽略管道符号,那么我就可以了。

当我看到名称“ErrorsHere”时尝试使用 XmlReader.Skip() 不起作用,显然它已经提前读取了一点并引发了异常。

TLDR:如何跳过,以便可以使用 XmlReader 读取上面的 XML 文件?

编辑:

有些人建议只替换'|' - 符号,但 XmlReader 的想法是不加载整个文件,而只遍历你想要的部分,因为我直接从文件中读取我无法读取整个文件,替换'|' 的所有实例 然后再次阅读部分:)。

4

3 回答 3

4

过去我已经对此进行了一些实验。

一般来说,输入必须是格式良好的。当基本 XML 规则被破坏时,XmlReader 将进入不可恢复的错误状态。避免模​​式验证很容易,但这与这里无关。

您唯一的选择是清理输入,这可以以流式方式(自定义 Stream 或 TextReader)完成,但这需要简单的解析形式。如果您在有效位置没有管道符号,这很容易。

于 2011-07-11T11:27:29.783 回答
1

一旦我遇到类似的情况(使用 HTML 文件,而不是 XML 文件)。但是我最终在将每个 HTML 文件输入到我的操作管道之前对它使用了正则表达式,以删除格式错误的部分。它派上用场,比使用 API 更容易。:)

于 2011-07-11T11:21:40.930 回答
1

XmlReader是严格的。任何不符合,都会出错。

所以不,除非您编写自己的 xml 实现,否则您不能这样做。修复格式错误的数据可能更容易。

于 2011-07-11T11:16:57.293 回答