noidic - Fr 17.08.07 11:42
Titel: Validierung gegen Schema
Mahlzeit,
für meine aktuelle Aufgabenstellung muss ich aus einer Schnittstelle XML-Daten einlesen und verarbeiten.
Ich würde nun die Daten gerne gegen ein Schema validieren. Das Schema liegt nicht als Datei vor, sondern als Konstante im Code.
MSXML kann ja sowas, also habe ich mir eine entsprechende Funktion gebastelt:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20:
| procedure ValidateXML(const DocXML: String; const SchemaXML: String; const SchemaNS: WideString); var MsxmlDoc: IXMLDOMDocument2; SchemaCache: IXMLDOMSchemaCollection; Error: IXMLDOMParseError; Schema : IXMLDOMDocument2; begin MSXMLDoc := CoDOMDocument.Create; Schema := CoDOMDocument.Create; MsXMLDoc.loadXML(DocXML); Schema.loadXML(SchemaXML); SchemaCache := CoXMLSchemaCache.Create; SchemaCache.add(SchemaNS, Schema); <--- Fehler MsxmlDoc.schemas := SchemaCache; Error := MsxmlDoc.validate; MSXMLDoc := nil; Schema := nil; if Error.errorCode <> S_OK then raise EValidateXMLError.Create(Error.reason); end; |
Bei der markierten Zeile meckert ein EOLEExcpetion "ungültige Definition für das Stammelement im Schema".
Wenn ich Schema und Daten in Dateien speichere und die mittels XMLSpy validiere, klappt alles.
Hier ein kurzer Auszug aus dem Schema:
XML-Daten
1: 2: 3: 4: 5:
| <?xml version="1.0" encoding="ISO-8859-1"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"> <xs:simpleType name="enum_form_type"> ... </xs:schema> |
Als SchemaNS übergebe ich
xmlns:xs="http:
Any ideas?
noidic - Fr 17.08.07 12:45
Das Problem liess sich relativ einfach lösen. Zum einen musste der MSXML-Parser in der Veriosn 4 installiert werden (MSXML 4 SP2), ich hatte bisher nur MSXML3.
Zum anderen habe ich den Code wie folgt angepasst und in meinem speziellen Fall für SchemaNS einen Leerstring übergeben:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20:
| procedure ValidateXML(const DocXML: String; const SchemaXML: String; const SchemaNS: WideString); var MsxmlDoc: IXMLDOMDocument2; SchemaCache: IXMLDOMSchemaCollection; Error: IXMLDOMParseError; Schema : IXMLDOMDocument2; begin MSXMLDoc := CoDOMDocument40.Create; Schema := CoDOMDocument40.Create; MsXMLDoc.loadXML(DocXML); Schema.loadXML(SchemaXML); SchemaCache := CoXMLSchemaCache40.Create; SchemaCache.add(SchemaNS, Schema); MsxmlDoc.schemas := SchemaCache; Error := MsxmlDoc.validate; MSXMLDoc := nil; Schema := nil; if Error.errorCode <> S_OK then raise EValidateXMLError.Create(Error.reason); end; |
nu gehts :)