2013-08-30 112 views
0

我已經讓自己陷入了一個我似乎無法想象的問題。我試圖以編程方式驗證使用DTD使用Microsoft下面的說明(Validation Using a DTD with XmlReaderVB.Net - 使用DTD驗證XML

生成的XML文件,這裏是我的代碼迄今:

Private Sub BTN_ValidateXMLdoc_Click(sender As Object, e As EventArgs) Handles BTN_ValidateXMLdoc.Click 

    Dim JobNumber As String = Me.HNF_JobName.Value 
    Dim XMLPath As String = "N:\" & JobNumber & "\" & JobNumber & ".xml" 


    ' Set the validation settings. 
    Dim settings As XmlReaderSettings = New XmlReaderSettings() 
    settings.DtdProcessing = DtdProcessing.Parse 
    settings.ValidationType = ValidationType.DTD 
    settings.ValidationFlags = XmlSchemaValidationFlags.ReportValidationWarnings 
    settings.ValidationFlags = XmlSchemaValidationFlags.ProcessInlineSchema 
    AddHandler settings.ValidationEventHandler, AddressOf ValidationCallBack 

    ' Create the XmlReader object. 
    Dim reader As XmlReader = XmlReader.Create(XMLPath, settings) 

    ' Parse the file. 
    While reader.Read() 
    End While 

End Sub 

' Display any validation errors. 
    Private Shared Sub ValidationCallBack(sender As Object, e As ValidationEventArgs) 
     MsgBox(String.Format("Validation Error: {0}", e.Message), MsgBoxStyle.OkOnly) 
    End Sub 

現在....就在於此我的問題。出於某種原因,ValidationCallBack EventHandler永遠不會被觸發。如果在讀取器中發生錯誤,執行它會引發異常錯誤。

糾正我,如果我錯了,但不應該調用ValidationCallBack子?

XML文件中存在錯誤,但不是由事件處理程序處理,而僅僅是拋出異常....

對於可能在這裏發生的事情我有任何想法嗎?

+0

您可以添加XML嗎? – Anuraj

+0

添加XML是什麼意思?它開始讀取XML文件,然後當標籤格式錯誤或XML文件中有錯誤時,它會拋出異常而不是觸發事件處理程序。 – cre8tivedaze

+0

DTD使用形式語法來描述兼容XML文檔的結構和語法; 「他們指定了XML文檔允許的內容和值。」 - 如果它不是一個有效的XML,它將失敗 – Anuraj

回答

0

您的代碼暗示DTD嵌入在XML文檔本身中。雖然這是可能的,但這不太可能是你想要的。我懷疑你的測試失敗了,因爲在實際的XML文檔中沒有嵌入的DTD。

如果DTD確實在XML文檔的外部,您需要告訴您的XmlReaderSettings在哪裏找到它。

從代碼中刪除行

settings.ValidationFlags = XmlSchemaValidationFlags.ProcessInlineSchema

確保在XML文檔中有一個DOCTYPE來指定DTD。如果沒有,則可能需要在驗證之前插入它。

如果你想避免每次下載DTD的開銷,你應該創建一個XmlResolver。一個例子見Problem validation a XML file with a local DTD file in C#

考慮將您的DTD轉換爲XML模式。 Schema在XmlReader中更自然。 DTD不理解XML名稱空間。