Entwickler-Ecke

Dateizugriff - Validierung gegen Schema


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: Stringconst SchemaXML: Stringconst 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://www.w3.org/2001/XMLSchema"

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: Stringconst SchemaXML: Stringconst 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 :)