![]() |
MSXML-Parser an Schema binden
Hallo!
Ich habe ein XML-Schema mit dem XML-Databinding Wizzard importiert und der baut eine schnurkelige Unit, um auf das XML-Teil zuzugreifen. Wenn ich jetzt aber ein XML-Dokument erzeugen will, soll er unbedingt den gleichen Aufbau benutzen, wie in der Schema-Datei. Wie bringe ich MSXML dazu? Es muss doch sowas geben wie:
Delphi-Quellcode:
Aber, ich weiss nicht wie das gehen soll :wall:
IXMLDocument.Schema := 'c:\schemas\mySchema.xsd'
|
Re: MSXML-Parser an Schema binden
Hallo alzaimar,
schau mal in die Dokumentation vom Platform SDK - "Referencing XSD Schemas in Documents" wäre dein Topic. Aber ich glaube du machst dir falsche Hoffnungen. Schemagebundene Validierung ist Bestandteil des Parsers, bei der Dokumentsynthese bist du auf eigene Programmlogik angewiesen. Ich treibe in meinen Projekten einigen Aufwand dazu - wenn ich meinen Code, der noch aus der Zeit der ersten MSXML.DLL stammt, ausmisten könnte, dann wäre ich nicht unglücklich. Bei der Synthese mittels DOM existiert zwar eine Methode validate(), aber die sagt dir nur, dass du was falsch gemacht hast, nachdem das Kind schon im Brunnen liegt. Grüße vom marabu |
Re: MSXML-Parser an Schema binden
:kotz:
Danke trotzdem... Also bauen wir uns das selber... |
Re: MSXML-Parser an Schema binden
Wieso gibts sowas eigentlich nichtz? Ich meine, was spricht dagegen, einen XML-Dokument so aufzubauen, dass man meinetwegen zunächst eine Art beginUpdate()-Methode aufruft, dann die Änderungen macht und dann beim Aufruf von endUpdate() geprüft werden würde, ob die Änderungen dem Schema / dem DTD entsprechen. Falls ja, alles OK. Falls nein, weg damit.
Besteht da kein Bedarf, hatte bisher noch niemand die Idee, oder gibts das schon und ich habs nicht mitgekriegt? Hm, weiß jetzt nicht, ob das direkt mit dem Thema zu tun hat, ich lasse es mal drin, die Mods mögen mir verzeihen :wink: |
Re: MSXML-Parser an Schema binden
Hallo Martin,
was du beschreibst, das gibt es. Das Validieren deiner Änderungen am IXMLDocument musst du allerdings selbst starten - mit doc.validate(). Eine automatische (nachträgliche) Prüfung wäre keine wesentliche Verbesserung. Was alzhaimar suchte war eine Methode, mit der man schema-konforme Änderungen durchführen kann. Die dafür benötigte Logik muss aber selbst implementiert werden. marabu |
Re: MSXML-Parser an Schema binden
Hallo marabu!
Kannst Du mir einen klitzekleinen Tipp geben, wie ich aus einem TXMLSchema (in der Unit gleichen Namens) ein leeres XML-Dokument erzeugen kann. Zur Not eben zu Fuss, also z.B. mit einer kleinen rekursiven Prozedur, die einfach durch die Schema-Hierarchie durchgeht und die XML-Nodes im Dokument sukkezzive erzeugt. Mein Problem ist, das ich, aufgrund von Termindruck, Faulheit und akuter Brett-Vorm-Kopferitis nicht verstehe, wie man das macht. Eigentlich habe ich von XML überhaupt keinen blassen Schimmer, ausser, das es mir den letzten Nerv raubt. Wie alles Neue :oops: Also: Wo stehen die 'Feldnamen' des im Schema definierten 'Records' (ums mal mit Pascal-Notation zu beschreiben)? Danke! |
Re: MSXML-Parser an Schema binden
Hallo alzaimar,
Zitat:
Erstmal ein bischen überlegen. Du erzeugst ja schon XML-Dokumente, aber die sind nicht valide, wenn ich das richtig verstanden habe. Eventuell ist es wirtschaftlicher eine XSL-Transformation zu fahren, als einen (universellen) Generator zu schreiben. Wenn es zeitlich bei dir eng ist, dann solltest du ernsthaft den XSLT-Ansatz prüfen. Ich habe zwei Generatoren im Einsatz. Der eine ist in einem XDR-gesteuerten Editor verbaut und hilft dem Anwender valide XML-Dokumente interaktiv zu erzeugen. Der andere erzeugt XML-Bücher aus einem Dutzend verschiedenen XML-Dokumentarten, wieder über XDR gesteuert. Der Aufwand ist relativ hoch, obwohl ich ein paar Restriktionen für das eh schon beschränkte XDR festgelegt habe. Also stelle dir das nicht zu leicht vor. Wenn du zu dem Schluss kommst, dass es eine Generatorlösung sein muss, dann werde ich dich nicht im Regen stehen lassen. Freundliche Grüße vom marabu |
Re: MSXML-Parser an Schema binden
Ich glaube, das wäre ein Overkill und für mich zu viel für den Anfang. Ich habe ja nur relativ simple 'Records'. Sowas wie:
Delphi-Quellcode:
bzw. das durch den Data Binding Wizzard erzeugte Interface. Ich werde also Folgendes versuchen:
TRec = Record
a : String; b : Integer; c : Array [0..n] of TAnotherRecord; d : Real End; Ich lese mir das Schema ein. Dank Deiner Weigerung, meine Frage zu beantworten, wo denn die Feld(=Element)Namen stehen, bin ich selbst drauf gekommen. Ich denke, ich bekomme es hin, anhand eines Schemas ein leeres XML-Dokument zu erzeugen, wobei alle 'Nodes' mit NULL-Werten belegt sind. Dadurch habe ich automatisch die richtige Reihenfolge. Anschließend fülle ich sie dann mit richtigen Werten. Das ist zwar alles Andere als performant, aber erstmal egal. Kann auch sein, das ich aus dem Schema einfach ein Codesnippet erstelle, das ich im Construktor einbaue. Damit sollte die korrekte Reihenfolge auch gewährleistet sein. Wenn ich Fragen habe, weiss ich ja, wo ich laut rumheulen muss :zwinker: Danke für den minimalistischen Tipp! |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:59 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz