2010-03-26 70 views
2

我有一個XmlSerializer對象,我也爲如下的添加2個事件處理程序的UnknownElement和UnknownAttribute事件:的XmlSerializer拋出InvalidOperationException異常

XmlSerializer xs = new XmlSerialiser(typeof(MyClass)); 
xs.UnknownAttribute += new XmlAttributeEventHandler(xs_UnknownAttribute); 
xs.UnknownElement += new XmlElementEventHandler(xs_UnknownAttribute); 

每個事件處理程序的基本做同樣的事情,他們打印出來導致問題的節點名稱或屬性名稱。

但由於某種原因,InvalidOperationException被拋出,說在xml文檔中有一個錯誤。我認爲這些錯誤會被我的事件抓住?

更新

例外包括:

例外情況是:未處理的異常:System.InvalidOperationException:有是XML文檔(5,110)的一個錯誤。

存在一個類型爲XmlException的InnerException,它聲明第5行的'MyTag'開始標記與'AnotherTag'的結束標記不匹配。第5行,第110位。

+0

當您需要尋求異常幫助時,發佈整個異常是一個好主意。發佈異常時運行ex.ToString()的結果。 – 2010-03-26 10:39:28

+0

@AndyC:這不是ex.ToString()的輸出,我問了很多理由。 – 2010-03-26 10:59:22

+0

我曾經見過類似的東西,深入瞭解最真實的問題,通常是錯誤的類型或類型問題。 – leppie 2010-03-26 11:04:49

回答

1

沒有看到MyClass的定義和您正在嘗試閱讀的XML,很難給出明確的答案。這就是說,異常的文本是相當明顯的,XML標記的格式不正確,而不是包含未知的元素和屬性,例如:

<AnotherTag> 
    <MyTag> 
    </AnotherTag> <--- This should be </MyTag> 
</MyTag>   <--- This should be </AnotherTag> 

UnknownAttribute/UnknownElement處理程序不會捕捉這一點,因爲結構XML是非常糟糕的。只有將XML文檔成功解析爲節點樹,子節點,屬性等之後,才能調用這些事件。

只是爲了進一步解釋關於UnknownAttribute/UnknownElement的一點;如果您的類/ XML只允許包含名爲Field1Field2的元素,那麼如果在XML中有一個名爲Field3的元素,則會發現UnknownElement事件。由於XML不是XML引發了InvalidOperationException,因此引發了UnknownElement事件,因爲XML中有一個意外的元素,儘管XML在其他情況下是有效的。

+0

@Rob是的,我不能發佈的XML不幸,但我不認爲這是必需的。基本上我需要做的是讓它告訴我它的格式不正確,即使它在多個地方出現故障。 當它拋出異常它會停止讀取我假設,所以如果有進一步的錯誤,這些將不會被發現,直到後續運行,對不對? – AndrewC 2010-03-26 11:04:48

+0

@AndyC - 它告訴你,在異常中的位置.. :)一旦命中,所有投注都將關閉,因爲任何進一步嘗試解析文檔都可能由於前面的錯誤而導致* false positive *,因此您的「在哪裏......即使......在多個地方「是一件相當困難的事情,當然不是我所知道的.NET本身提供的.net框架。 – Rob 2010-03-26 11:10:20

+0

啊,說得好!感謝您的答覆,讚賞。 – AndrewC 2010-03-26 11:12:29

0

您正在處理的兩個事件與XML文檔結構中的錯誤無關。

一旦您發佈特定異常,我會盡力幫您解決特定問題。你甚至可能需要發佈XML。


從您發佈的部分例外的容貌,看來你的文件是無效的XML(不匹配的標籤)。沒有辦法來檢測這種短缺的異常。

+0

@John我已經在OP的更新中發佈了異常。有沒有辦法讓我檢測xml文檔結構中的錯誤,而不必捕捉異常? – AndrewC 2010-03-26 10:45:31

+0

你可以發佈異常的堆棧跟蹤嗎? – 2010-03-26 10:57:53

相關問題