使用c# 's XmlReader处理略显畸形的XML

本文关键字:XML 处理 XmlReader 使用 | 更新日期: 2023-09-27 18:01:57

我试图使用c#的XmlReader对大量的XML文件,他们都是正确的格式化除了几个选择的(不幸的是,我不是在一个位置有他们改变,因为它会打破很多其他代码)。

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

坏的部分是这样的:

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

所以如果我能忽略无效的标签,或者忽略管道符号,那就没问题了。

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

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

编辑:

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

使用c# 's XmlReader处理略显畸形的XML

我在过去做过一些这样的实验。

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

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

XmlReader严格。

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

我曾经遇到过类似的情况(使用HTML文件,而不是XML文件)。但是,在将每个HTML文件输入到操作管道之前,我最终使用正则表达式来删除格式不正确的部分。它很方便,比纠结于API更容易。:)