Einzelnen Beitrag anzeigen

Gor1

Registriert seit: 11. Mai 2011
32 Beiträge
 
Delphi 10.4 Sydney
 
#1

XML Datenbindung und Substitution Groups

  Alt 6. Mär 2015, 09:35
Hallo,

ich habe mit der XML-Datenbindung von Delphi einem XML-Schema entsprechende Klassen erzeugt. Allerdings gelingt es mir nicht, damit dann dem Schema entsprechende XML-Dateien so einzulesen, dass auch die entsprechenden Delphi-Objekte erzeugt werden. Genausowenig kann ich diese Delphi-Objekte aus dem Programm heraus erzeugen.

Das Problem liegt dabei darin, dass im Schema sogenannte Substitution Groups verwendet werden. Ich habe mal ein stark vereinfachtes Beispielschema und die mit der Datenbindung generierte Source-Datei (Beispielschema.pas) angehängt, sowie eine Beispieldatei, die mit dem Schema validiert werden kann.

Als Beispiel:
Ich habe im Programm ein Objekt vom Typ IXMLBasis erzeugt (mit NewBasis) und will jetzt ein neues Element vom Typ IXMLElement1 erzeugen. Die einzige Funktion in Beispiel.pas, mit der ich ein neues Listenelement erzeugen kann, ist die Funktion Add, die aber ein IXMLListenElement zurück liefert und kein IXMLElement1. Ich habe dann versucht, eine weitere Add-Funktion zu schreiben, die ein IXMLElement1 zurückgibt:
Delphi-Quellcode:
function TXMLBasis.Add: IXMLElement1;
begin
  Result := AddItem(-1) as IXMLElement1;
end;
Aber die Ausführung scheitert dann immer mit der Fehlermeldung EIntfCastError 'Interface nicht unterstützt' (ich nehme an, weil das AddItem(-1) ein IXMLListenElement zurück liefert, aber ich weiß nicht, wo ich beeinflussen kann, wass AddItem liefert).

Umgekehrt funktioniert das Einlesen der Beispieldatei auch nicht. Das XML kann zwar ohne Fehler gelesen werden, aber IXMLBasis.Count ist Null, obwohl ja fünf Listenelemente vorhanden sein sollten. Es wird also nicht erkannt, dass Element1, Element2 und Element3 Untertypen von Listenelement sind und deshalb auch in der Liste der Listenelemente auftauchen sollten. Geht man direkt die Childnodes des XML-Dokuments durch (also an der von der Datenbindung erzeugten Struktur vorbei), dann findet man auch die entsprechenden Einträge für die Elemente.

Hat jemand eine Idee, wie sich die Probleme lösen lassen? Oder gibt es vielleicht andere Delphi-Komponenten für die XML-Datenbindung, die solche Konstruktionen unterstützen?
Angehängte Dateien
Dateityp: 7z Beispiel.7z (2,7 KB, 17x aufgerufen)
  Mit Zitat antworten Zitat