我遇到了一些我似乎无法弄清楚的问题。我正在尝试使用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文件中存在错误,但它不是由事件处理程序处理,而是抛出异常....
我对这里可能发生的事情持开放态度?
答案 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名称空间。