It's a pretty common thing to want to do - someone gives you an XML document and you want to check it matches your schema. In the .NET world you'd use the XmlValidatingReader and some code like this:
Private Sub validate()
Dim doc As New Xml.XmlDocument
Dim reader As New Xml.XmlTextReader("c:\input.xml")
Dim validatingReader As New Xml.XmlValidatingReader(reader)
validatingReader.Schemas.Add("my namespace", "c:\myschema.xsd")
AddHandler validatingReader.ValidationEventHandler, AddressOf Me.ValidationEventHandler
doc.Load(validatingReader)
End Sub
Private Sub ValidationEventHandler(ByVal sender As Object, ByVal Arguments As Xml.Schema.ValidationEventArgs)
'do something with the errors
End Sub
Unfortunately if someone has sent you a document that's part of a completely different namespace to your schema the XmlValidatingReader simply loads merrily away and doesn't throw any errors at all.
The validation engine says to itself "hmm, can't find a schema for namespace A, therefore I can't do any validation'. Once you think about this it makes perfect sense - you've given it the schemas to use, it's not its fault if the schema it needs isn't in there.
A very simple work around is just to do something like the following:
If doc.DocumentElement.NamespaceURI <> "my target namespace" ThenThrow New ApplicationException("Target namespace of the document was crap") End If
This very simple gotcha passed me by for a long time till one of our apps started to fall over because the XML didn't look like what it was expecting even though it had validated it successfully.
No comments:
Post a Comment