2011-07-11 27 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上更容易。 :)