2009-07-30 83 views
3

我們有各種由當前發行版中的應用程序生成的XML文件。其中一些文件包含無效字符,導致它們無效的XML,除非所有驗證都關閉,否則在大多數情況下將無法加載,然後僅在XmlDocument實例中,而不是XDocument如何加載unsanitized XML?

由於這個應用程序已經有那裏,我們必須應付它產生的文件。現在,我可以繼續添加Sanitizer類型,在知道要查找的內容以及如何在嘗試加載文檔之前解決該問題,但我希望有人可能已經投入了努力來生成可能已經完成的工作一種有效的方式(例如SanitizedXmlReader類)。

This question涉及同一主題,但我沒有找到滿意的答案。我們只需要刪除XML文件中任何地方無效的內容(而不是僅在CDATA中有效的數據或在QName中未使用的數據)。

那麼,是否存在這樣一種可以將「幾乎」XML文件轉換爲「至少沒有無效字符」XML文件的東西?如果不是,滾動我們自己是下一個選擇。在這種情況下,與其花費時間解釋XML規範來確定哪些字符在所有情況下都是非法的,是否有某個確定的列表?

回答

2

SGMLReader幾年前用來加載蹩腳的HTML代碼。這也可以幫助您解析無效的XML。

PS:與此同時,有一個NuGet package,來源可在Github

+0

謝謝!我忘記了SGMLReader。 – 2009-07-30 17:37:20

3

問題

如果你寫出來自己,知道哪些字符是有效的,絕對是一個有點棘手。

XML 1.1改變了規則,但讓我們假設沒有人使用它(因爲幾乎沒有人會這樣做),並堅持1.0。

XML 1.0 revision 5更改規則也從earlier versions,但不是以任何方式您可以從文檔本身告訴。它簡化了一些與Unicode相關的內容,但與一些原始規範作者的建議相反。我們也假裝這個問題不存在。

回答

Java有這個可愛的小類,XmlChar,裏面有你可以用它來確定哪些字符是有效的,其構造方法。 .Net沒有,但Mono項目包含System.Xml.XmlChar的來源,這可能會幫助你。

你可能會開始篩選出所有字符肯定不允許任何地方。從上面的Mono類的XmlChar.IsValid(char c)方法應該有所幫助。

知道應用程序產生的其他類型的壞XML會很有趣。