Autor Beitrag
noidic
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 851

Win 2000 Win XP Vista
D7 Ent, SharpDevelop 2.2
BeitragVerfasst: Fr 17.08.07 11:42 
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:

ausblenden 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:

ausblenden 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?

_________________
Bravery calls my name in the sound of the wind in the night...
noidic Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 851

Win 2000 Win XP Vista
D7 Ent, SharpDevelop 2.2
BeitragVerfasst: 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:

ausblenden 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 :)

_________________
Bravery calls my name in the sound of the wind in the night...