2011-07-11 30 views
9

我想在一大串XML文件中使用C#的XmlReader,它们都被正确地格式化,除了一些选择的(不幸的是我不能让它们改变,因为它会打破很多其他代码)。使用C#的XmlReader稍微畸形的XML

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

坏的部分是这样的:

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

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

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

TLDR:如何跳过以便我可以使用XmlReader读取上述XML文件?

编辑:

有些人建议只更换“|” - 符号,但XmlReader中的想法是不加载你想整个文件,但只有横向部分,因为我直接从文件中读取我无法承担读取整个文件,替换'|'的所有实例然后再读部分:)。

+0

取代|加载阅读器之前签署 - 可以解决问题 –

+0

你如何阅读信息到XmlReader?你正在阅读流吗? – Jethro

+3

如果您事先知道错误,您是否可以在解析源代码之前修补源代码的内容?但以一般的方式,你应该改正源XML ...或不要称之为XML(我想你是依赖于别人...?) –

回答

4

我已经在过去尝试了一下。

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

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

+0

嘿亨克,这对我来说似乎是最好的解决方案。我也尝试加载整个文件并更换管道,但是这使得解析需要两倍的时间(即使我使用内存流来存储加载的数据)。扩展一个流或TextReader似乎是一个不错的主意,继续保持高性能。 –

1

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

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

+0

更简单也更干净 –

1

一旦我有类似的情况(与HTML文件,而不是XML文件)。但是,在将每个HTML文件输入到我的操作管道之前,我最终使用了正则表达式来删除格式不正确的部分。它来得方便,比挣扎在API上更容易。 :)