2012-03-14 216 views
3

我有它運行測試,並生成一個網格視圖,所有的結果在裏面,也是一個XML日誌文件的程序。該程序還具有加載日誌以複製網格視圖的功能。讀取XML與未關閉標籤C#

由於程序寫入日誌文件作爲其執行,如果它崩潰日誌文件將缺少結束標記。我仍然希望能夠加載這些XML文件,因爲仍然有許多有價值的數據可以幫助我找出導致崩潰的原因。

我想通過XML文件可能會和關閉關閉任何未關閉的XML標記,也可能寫某種「骯髒」的XML閱讀器會假裝每一個標籤被關閉。關於我能做什麼或應該如何進行的任何想法?

編輯:

<Root> 
    <Parent> 
    <Child Name="One"> 
     <Foo>...</Foo> 
     <Bar>...</Bar> 
     <Baz>...</Baz> 
    </Child> 
    <Child Name="Two"> 
     <Foo>...</Foo> 
     <Bar>...</Bar> 
!-- Crash happens here --! 

從這個我還是會看生產

Child Foo Bar Baz 
One  ... ... ... 
Two  ... ... /
+2

從技術上講,帶有未封閉標籤的XML不是XML,就像VB不是C#一樣。 – 2012-03-14 14:30:51

+1

你試過XmlReader嗎?這是最多(唯一)寬容的閱讀方式。 – 2012-03-14 14:30:52

+1

此鏈接可能會有所幫助。 HTTP://計算器。COM /問題/ 9681084 /最容易的方式去除的,無效字符,從-A-XML的文件/ 9681642#9681642 – 2012-03-14 14:34:27

回答

5

想必這一切都有效,直到它被截斷......所以使用XmlReader可以工作...只是準備當它到達截斷點時處理它。

現在XmlReader API並不十分愉快(IMO),所以你可能要轉移到一些有趣的數據的開始(這必須是本身可完成),然後調用XNode.ReadFrom(XmlReader)方法來獲取該數據一個簡單易用的表單。然後移動到下一個元素的開始,做同樣的,等

示例代碼:

using System; 
using System.Linq; 
using System.Xml; 
using System.Xml.Linq; 

class Program 
{ 
    static void Main(string[] args) 
    { 
     using (XmlReader reader = XmlReader.Create("test.xml")) 
     { 
      while (true) 
      { 
       while (reader.NodeType != XmlNodeType.Element || 
        reader.LocalName != "Child") 
       { 
        if (!reader.Read()) 
        { 
         Console.WriteLine("Finished!"); 
        } 
       } 
       XElement element = (XElement) XNode.ReadFrom(reader); 
       Console.WriteLine("Got child: {0}", element.Value); 
      } 
     } 
    } 
} 

示例XML:

<Root> 
    <Parent> 
    <Child>First child</Child> 
    <Child>Second child</Child> 
    <Child>Broken 

輸出示例:

了孩子:第一個孩子 有孩子:第二個孩子

Unhandled Exception: System.Xml.XmlException: Unexpected end of file has occurred 
The following elements are not closed: Child, Parent, Root. Line 5, position 18. 
    at System.Xml.XmlTextReaderImpl.Throw(String res, String arg) 
    at System.Xml.XmlTextReaderImpl.ParseElementContent() 
    at System.Xml.Linq.XContainer.ReadContentFrom(XmlReader r) 
    at System.Xml.Linq.XContainer.ReadContentFrom(XmlReader r, LoadOptions o) 
    at System.Xml.Linq.XElement.ReadElementFrom(XmlReader r, LoadOptions o) 
    at System.Xml.Linq.XNode.ReadFrom(XmlReader reader) 
    at Program.Main(String[] args) 

所以,很顯然,你會想捕獲異常,但你可以看到,它成功地正確讀取前兩個元素。

0

在框架中沒有這樣的事情,默認情況下這樣做,也沒有一個好的解決方案可用,將以某種方式解析通用無效的XML。

最SensAble公司的事宇能做的就是開始閱讀之前,固定XML。由於只有結束被切斷,您應該能夠找出所有打開的標籤並關閉它們。

+2

的OP是要求_how_修復XML – 2012-03-14 14:34:23

+0

@HenkHolterman我明白他的問題的方法是,他想在哪個方向,他應該進行諮詢,並我的建議是跟隨他的第一反應和分析之前創建有效的XML,而不是創建一個drity讀卡器,復讀的問題仍然得到同樣的印象 – ntziolis 2012-03-14 14:43:10

4

作爲最後的手段,根據您在做什麼,您可以使用HTML閱讀器,如HtmlAgilityPackNuget page)或SGMLReader。 SGMLReader實際上會將其轉換爲XmlDocument,所以這可能更符合您的需求。

當然,HTML不是XML,因此您可以在使用此方法時獲得所需內容。

+0

+1 SGMLReader,它的工作原理。它可以通過[NuGet](https://www.nuget.org/packages/SgmlReader/)實際下載。 – Szybki 2017-05-15 19:49:17