XML-Validierung mit VB6 - manche Mitglieder von IXMLDOMParseError bleiben leer

odCaplan

Grünschnabel
Hallo,


Wenn ich ein (absichtlich fehlerhaftes) XML-Document mit einem "validation engine" meiner Wahl (hier XML validator von Liquid Technologies) bekomme ich folgende Information :
parseError.errorCode : -1072897687
parseError.filepos : 834
parseError.line : 27
parseError.linepos : 21
parseError.reason : 'P' verstößt gegen enumeration-Einschränkung von 'I V N'.
Analyse des Elements '{http://xxxx.com/ns/Export}vm_artverfp3' mit dem Wert 'P' fehlgeschlagen.
parseError.srcText : <vm_artverfp3>P</vm_artverfp3>
parseError.url : file:///d://XMLVALIDATE/XML/VerfahrenSchnittstelle.xml


In VB6 möchte ich auch auf diese Information zugreifen. Dafür benutze ich ein IXMLDOMParseError-Object (msxml4.dll)


Die Mitglieder von IXMLDOMParseError sind :
.errorCode
.filepos
.Line
.linepos
.reason
.srcText
.url

Wenn die Validierung nicht erfolgreich ist, kann ich .errorCode und .reason lesen. Alle andere Mitglieder bleiben hartnäckig leer oder 0. Ich möchte aber gerne den Wert von srcText interpretieren können.



Dim objSchemas As MSXML2.XMLSchemaCache40
Dim objXML As MSXML2.DOMDocument40
Dim objXSD As MSXML2.DOMDocument40
Dim objErr As MSXML2.IXMLDOMParseError


' XML validieren
Set objErr = objXML.Validate()


If objErr.errorCode = 0 Then
' ERFOLGREICH
Else
' FEHLER
Debug.Print objErr.errorCode
Debug.Print objErr.reason

Debug.Print objErr.filepos
Debug.Print objErr.Line
Debug.Print objErr.linepos
Debug.Print objErr.reason
Debug.Print objErr.srcText
Debug.Print objErr.url

End If

Weiß jemand warum es so ist ?

danke im Voraus


2007-09-03 - Es hat sich erledigt :


Folgendes Beispiel hatte ich gefunden :

' load XML file (without validation - that comes later)
Set objXML = New MSXML2.DOMDocument40
objXML.async = False
objXML.validateOnParse = False
objXML.resolveExternals = False

' load XML, without any validation
If Not objXML.Load(strXMLPath) Then
Err.Raise 1, "Validate", "Load XML failed: " & objXML.parseError.reason
End If

' bind Schema Cache to DOM
Set objXML.schemas = objSchemas

' does this XML measure up?
Set objErr = objXML.Validate()

' any good?
If objErr.errorCode <> 0 Then
Debug.Print objErr.errorCode
Debug.Print objErr.reason

' werden nicht angezeigt
Debug.Print objErr.filepos
Debug.Print objErr.Line
Debug.Print objErr.linepos
Debug.Print objErr.reason
Debug.Print objErr.srcText
Debug.Print objErr.url
End If


Dieses Beispiel ist OK - hat aber als Nebeneffekt, daß nur .errorCode und .reason zu sehen sind.


Folgende Methode funktioniert (so weit ich es testen konnte) besser :

' XML Object
Set objXML = New MSXML2.DOMDocument50

' XML laden
objXML.async = False
objXML.validateOnParse = True
objXML.resolveExternals = True

If Not objXML.Load(strXMLPath) Then
' FEHLER

Debug.Print "errorCode " & objXML.parseError.errorCode
Debug.Print "reason " & objXML.parseError.reason

Debug.Print "filepos " & objXML.parseError.filepos
Debug.Print "Line " & objXML.parseError.Line
Debug.Print "linepos " & objXML.parseError.linepos
Debug.Print "srcText " & objXML.parseError.srcText
Debug.Print "url " & objXML.parseError.url

Else
MsgBox "Keinen Fehler"

End If
 
Zuletzt bearbeitet:
Zurück