VB.Net - 使用DTD验证XML

时间:2013-08-30 08:46:05

标签: asp.net xml vb.net

我遇到了一些我似乎无法弄清楚的问题。我正在尝试使用Microsoft的以下说明使用DTD以编程方式验证生成的XML文件(Validation Using a DTD with XmlReader

到目前为止,这是我的代码:

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永远不会被触发。如果在reader.Read()执行期间发生错误,则会引发异常错误。

如果我错了,请纠正我,但是不应该调用ValidationCallBack子?

XML文件中存在错误,但它不是由事件处理程序处理,而是抛出异常....

我对这里可能发生的事情持开放态度?

1 个答案:

答案 0 :(得分: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名称空间。