2011-04-18 88 views
4

我有一個格式不正確的XML文件。根標籤沒有被標籤關閉。最後的標籤丟失。 。XDocument:是否可以強制加載格式不正確的XML文件?

當我嘗試加載我的畸形XML文件在C#

StreamReader sr = new StreamReader(path); 
batchFile = XDocument.Load(sr); // Exception 

我得到一個異常「發生意外的文件結尾以下元素未封閉:批次線54,位置1。

是否可以忽略關閉標籤或強制加載?我注意到,我所有的XML工具((如XML記事本))自動修復或忽略該問題。我無法修復XML文件。這是一個來自第三方軟件的副本,有時候這個文件是正確的。

回答

3

之前,你不能用XDocument這樣做,因爲這個類加載在內存中的所有文件,並解析它完全地。
但它可能處理文檔與XmlReader它會讓你閱讀和處理完整的文件,並在最後你會缺少標籤豁免。

1

你可以做的是將結束標記添加到內存中的XML,然後加載它。

所以加載XML到的StreamReader後,操縱數據你做的XML負載

3

我建議使用Tidy.NET清理凌亂的輸入

Tidy.NET有一個很好的API在你的「XML」得到的問題(MessageCollection)的列表,你可以用它來解決在內存中的文本流。最簡單的事情就是一次解決一個錯誤,認爲這樣的錯誤不會很好。否則,可能會修正錯誤反向文檔順序,以便消息的偏移量保持有效,而做修補

這裏是一個HTML輸入轉換爲XHTML的例子:

整潔整齊=新整潔();

/* Set the options you want */ 
tidy.Options.DocType = DocType.Strict; 
tidy.Options.DropFontTags = true; 
tidy.Options.LogicalEmphasis = true; 
tidy.Options.Xhtml = true; 
tidy.Options.XmlOut = true; 
tidy.Options.MakeClean = true; 
tidy.Options.TidyMark = false; 

/* Declare the parameters that is needed */ 
TidyMessageCollection tmc = new TidyMessageCollection(); 
MemoryStream input = new MemoryStream(); 
MemoryStream output = new MemoryStream(); 

byte[] byteArray = Encoding.UTF8.GetBytes("Put your HTML here..."); 
input.Write(byteArray, 0 , byteArray.Length); 
input.Position = 0; 
tidy.Parse(input, output, tmc); 

string result = Encoding.UTF8.GetString(output.ToArray()); 
+0

添加示例代碼段轉換成HTML - > XHTML – sehe 2011-04-18 10:14:01

+0

我沒有得到這個與XML運作良好。除非我錯過了Tidy.NET不是爲XML設計的。 – 2014-10-07 15:55:41

+0

是的。整潔意在消毒不衛生的HTML。因爲XHTML存在,所以值得一試。 – sehe 2014-10-07 15:58:43