我试图使用c#的XmlReader对大量的XML文件,他们都是正确的格式化除了几个选择的(不幸的是,我不是在一个位置有他们改变,因为它会打破很多其他代码)。
错误只来自这些烦人的XML文件的一个特定部分,可以跳过它们,但我不想停止阅读XML文件的其余部分。
坏的部分是这样的:
<InterestingStuff>
...
<ErrorsHere OptionA|Something = "false" OptionB|SomethingElse = "false"/>
<OtherInterestingStuff>
...
</OtherInterestingStuff>
</InterestingStuff>
所以如果我能忽略无效的标签,或者忽略管道符号,那就没问题了。
当我看到名称"ErrorsHere"不起作用时,试图使用XmlReader.Skip(),显然它已经提前读取了一点并抛出异常。
TLDR:我如何跳过,以便我可以在上面的XML文件中读取,使用XmlReader?
编辑:有些人建议只是替换'|'-符号,但XmlReader的想法是不加载整个文件,但只遍历你想要的部分,因为我直接从文件中读取,我不能在整个文件中读取,替换'|'的所有实例,然后再次读取部分:)。
我在过去做过一些这样的实验。
一般来说,输入必须是格式良好的。当基本的XML规则被破坏时,XmlReader将进入不可恢复的错误状态。避免模式验证很容易,但这与此无关。
您唯一的选择是清理输入,这可以通过流式方式完成(自定义流或TextReader),但这将需要轻量级的解析形式。如果在有效位置上没有管道符号,这很容易。
XmlReader
严格。
所以,不,你不能这样做,除非你自己编写xml实现。修复错误的数据可能更容易。
我曾经遇到过类似的情况(使用HTML文件,而不是XML文件)。但是,在将每个HTML文件输入到操作管道之前,我最终使用正则表达式来删除格式不正确的部分。它很方便,比纠结于API更容易。:)