使用C#的XmlReader处理略有格式问题的XML

9
我正在尝试使用C#的XmlReader读取一系列大型的XML文件,它们都被正确格式化,除了其中一些选择性的文件(不幸的是我没办法让它们改变,因为这会破坏许多其他代码)。
错误只来自于这些恼人的XML文件中的一个具体部分,跳过这些部分是可以的,但我不想停止读取其余的XML文件。
坏的部分看起来像这样:
 <InterestingStuff>
  ...
    <ErrorsHere OptionA|Something = "false" OptionB|SomethingElse = "false"/>
    <OtherInterestingStuff>
    ...
    </OtherInterestingStuff>
</InterestingStuff>

所以,如果我可以忽略无效标签,或者忽略管道符号,那么我就没问题了。
当我看到名称“ErrorsHere”时尝试使用XmlReader.Skip()不起作用,显然它已经读取了一点并抛出了异常。
简而言之:如何使用XmlReader跳过<ErrorsHere>,以便读取上面的XML文件?
编辑:
有人建议只是替换'|'符号,但是XmlReader的想法是不加载整个文件而仅遍历您想要的部分,因为我直接从文件中读取,所以我不能承担读入整个文件,再次替换所有实例 '|' 然后再次读取部分 :)。

在加载读取器之前用 - 替换 | 符号可能解决问题。 - Prashant Lakhlani
你是如何将信息读入XmlReader的?你是从流中读取吗? - Jethro
3
如果你知道错误的内容并且可以在解析之前修补源代码,那么你就能做到这一点吗?但一般情况下,你应该纠正源XML文件...或者不要称其为XML(我猜想你可能依赖于别人...?) - Steve B
1
好的建议,但我不想读取整个文件(这就是为什么我使用XmlReader而不是XmlDocument.Load()),因为这可能很昂贵,而且我不需要文件中的所有信息。澄清一下,我使用XmlReader.Creat(filepath)直接从磁盘读取,并且是依赖于其他人,所以我无法对源代码进行任何更改。 - Roy T.
+1 Steve B - XmlReader 读取 Xml,因此将非 Xml 输入转换为有效的 Xml,并在隔离的方法中保持其余代码的清洁。 - C.Evenhuis
3个回答

4
我过去曾经进行了一些实验。
总的来说,输入只需要符合基本的格式要求即可。当基本的XML规则被破坏时,XmlReader将进入无法恢复的错误状态。避免模式验证很容易,但这与本文不相关。
你唯一的选择是清理输入,可以通过流式处理(自定义流或TextReader)来完成,但这将需要轻量级的解析。如果在有效位置没有管道符号,那就很容易。

嗨,亨克,这对我来说似乎是最好的解决方案。我也尝试过只加载整个文件并替换管道,但这使解析时间加倍(即使我使用了内存流来存储加载的数据)。扩展流或TextReader似乎是保持高性能的好主意。 - Roy T.

1

XmlReader 是严格的。任何不符合规范的内容都会导致错误。

所以,除非你编写自己的 XML 实现,否则不能这样做。修复格式不正确的数据可能更容易。


1

我曾经遇到过类似的情况(不是 XML 文件,而是 HTML 文件)。但最终我选择在将每个 HTML 文件输入到我的操作管道之前使用正则表达式删除格式不正确的部分。这非常方便,比与 API 斗争要容易得多。:)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接