Entwickler-Ecke
Dateizugriff - XML Datei erstellen
lkz633 - Mi 13.08.03 18:46
Titel: XML Datei erstellen
Hallo,
ich kann ohnen Probleme mit IXMLDocument eine XML-Datei einlesen und auf bestimmte Knoten zugreifen.
Jetzt versuche ich, selber XML Dateien zu erstellen, bekomme es aber beim besten Willen nicht hin. Habe schon alles versucht, addchild, createnode, createelement. es kommt nie eine Fehlermeldung, aber die XML Datei bleibt leer.
Koennte jemand einen Quellcode posten, der z.B folgende Struktur erzeugt:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| <Firma> <Mitarbeiter> <id>1</id> <Name>olaf</Name> <Ort>...</Ort> </Mitarbeiter> <Filiale> </Filiale> </Firma> |
Das waere sehr hilfreich fuer mich
MFG lkz633
Delete - Do 14.08.03 09:41
Erst kürzlich in der DP beantwortet. :wink: Wenn du den Parser von Microsoft benutzt, dann erstellst du zuerst ein neues Objekt:
Delphi-Quelltext
1: 2:
| xmldoc := CoDOMDocument.Create; |
und dann erstellst die gewünschte Struktur:
Delphi-Quelltext
1:
| xmldoc.loadXML('<Firma><Mitarbeiter><!-- usw. --></Mitarbeiter><Filiale/></Firma>'); |
Voilà, und du kannst darauf zugreifen. Das müsste IMHO auch mit anderen XML-Parsern ähnlich gehen.
lkz633 - Do 14.08.03 11:52
Hallo,
mit IXMLDocument geht es mit xml.add.
Aber es muss doch auch irgendwie mit createelement und addchild usw machbar sein oder? Ich braeuchte es so, da ich am Anfang noch nicht die ganze Struktur weiss und spaeter Knoten hinzufuegen moechte.
MFG lkz633
Delete - Do 14.08.03 13:05
Tja, ich kann (leider) wieder nur für MS-XML sprechen, aber wenn du das XMLDocument benutzt, müsste dir doch eigentlich die Code-Vervollständigung von Delphi helfen?!
Sprich: Name des Objektes eintippen, Punkt ran und warten ... bis Delphi die Liste mit den Möglichkeiten bringt. Du könntest dann durch Tippen von c-r-e-a-t-e usw. fündig werden.
Oder du müsstest mal in der Doku von diesem IXMLDocument suchen.
lkz633 - Do 14.08.03 13:11
MathiasSimmack hat folgendes geschrieben: |
Sprich: Name des Objektes eintippen, Punkt ran und warten ... bis Delphi die Liste mit den Möglichkeiten bringt. Du könntest dann durch Tippen von c-r-e-a-t-e usw. fündig werden.
Oder du müsstest mal in der Doku von diesem IXMLDocument suchen. |
Das habe ich selbstverstaendlich getan, und deswegen z.B createelement auch benutzt, wie in der Hilfe beschrieben, doch die gespeicherte datei ist leer :(
Delete - Do 14.08.03 13:40
Also: steig um auf den Parser von Microsoft. :mrgreen: Dazu kann ich dir wenigstens eine funktionierende Anleitung geben. :wink:
Sasfatu - Fr 09.07.04 15:45
Natürlich geht das!
Ich bin zwar was Delphi angeht ziemlicher newbie, aber xml geht mit den
von Dir beschriebenen Funktionen (heißen halt ein bischen anders) auch
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| procedure CreateXML var xmldoc : IXMLDOMDocument; root : IXMLDOMElement; elem : IXMLDOMElement; begin xmldoc := CoDOMDocument.Create; root := xmldoc.createElement('firma'); elem := xmldoc.createElement('mitarbeiter'); elem.setAttribute('name','olaf maier'); root.appendChild(elem); xmldoc.documentElement.appendChild(Root); xmldoc.save('d:\test.xml'); end; |
Du kannst Dir ja mal bei Microsoft die Hilfe anschauen. Da findest Du viel darüber
Leider bin ich ich mit Delphi noch nicht so vertraut. Ich bin immer noch
auf der Suche wie ich eine doctype dem xml Dokument anhängen kann.
Gruß
Sas
Moderiert von
Peter Lustig: Code- durch Delphi-Tags ersetzt.
Delete - Fr 09.07.04 17:44
Bis nächsten Monat konntest du nicht warten, wie? Dann wär´s nämlich genau ein Jahr später gewesen. :mrgreen:
Außerdem ist das Problem bei deinem Code, dass du konsequent alle Schutzmechanismen ignorierst. Die meisten Dinge sind Funktionen, bei denen man den Erfolg oder Misserfolg auf die ein oder andere Weise am Rückgabeergebnis ablesen kann.
MSCH - Fr 09.07.04 19:04
wenn ich dazu mal was sagen darf;
Die korrekte Vorgehensweise wäre eine DTD oder Schema der XML Datei anzulegen.
Dann wird das XMLDocument geöffnet, das Schema/DTD geöffnet und eine Wrapperklasse generiert, die dann so ungefähr aussieht.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68:
| IXMLPage = interface; TXMLPageFolders = class; TXMLFolder = class;
IXMLPage = interface(IXMLNode) ['{4966633E-A165-43BA-AEEF-86690C1625A6}'] function Get_Index: Integer; function Get_Config: IXMLConfig; function Get_LastUpdate: WideString; TXMLPageFolders = class(TXMLNodeCollection, IXMLPageFolders) protected function Get_Folder(Index: Integer): IXMLFolder; function Add: IXMLFolder; function Insert(const Index: Integer): IXMLFolder; public procedure AfterConstruction; override; end;
TXMLFolder = class(TXMLNode, IXMLFolder) protected function Get_FolderID: Integer; function Get_FolderName: WideString; function Get_FolderUrl: WideString; procedure Set_FolderID(Value: Integer); procedure Set_FolderName(Value: WideString); procedure Set_FolderUrl(Value: WideString); end;
u.s.w.
var MXML: IXMLPage; CXML: IXMLFolder; XML.Active:= true; XML.Version:='1.0'; XML.StandAlone:='yes'; XML.Encoding:='ISO-8859-1'; MXML:= GetPage(XML); ...
while not Clients.eof do begin CXML:= MXML.PageFolders.Add; CXML.FolderID:= ClientsPageID.Value; ...
und als joke sozusagen, noch ein stylesheet draufhauen function TWeb.ApplyXSL(XMLBody, XSLBody : string) : string; var XSL, XML : IXMLDOMDocument; begin try XSL:=CreateOleObject('Microsoft.XMLDOM') as IXMLDOMDocument; XSL.async:=False; XSL.loadXML(XSLBody); XML:=CreateOleObject('Microsoft.XMLDOM') as IXMLDOMDocument; XML.async:=False; XML.loadXML(XMLBody); Result:=XML.transformNode(XSL); except result:=''; end; end; |
alles klare??? :-)
grez
msch
Delete - Fr 09.07.04 19:49
Äh, aber wozu soll das alles gut sein? Hier ... in diesem speziellen Fall?, ... der ohnehin seit Monaten erledigt sein dürfte ... Wozu brauchst du hier einen Wrapper? Das ist doch nur sinnvoll, wenn du eine XML-Datei bspw. nach HTML transformieren willst. Für den Zugriff auf Knoten, das Erstellen von neuen Knoten, usw. ist ein Wrapper nicht erforderlich. Oder zumindest keiner, der so umfangreich (um das Wort "kompliziert" zu vermeiden) ist.
MSCH - Sa 10.07.04 19:19
lass uns den fall mal aufrollen :-)
Mit Wrapper meine ich keine Datenkonvertierung, sondern das Teil was sich öffnet wenn man doppelt auf ein TXMLDocument klickelt. Dann Schema/XML/DTD öffnen das ganze rödeln lassen und raus kommen schöne Interfaces in einer neuen Unit.
(Dat war der obige Quelltext).
Ansonsten reicht auch ein (dat isch kompliziert) writeln (textfile,'xmlcode');
grez
msch
Delete - Sa 10.07.04 19:25
Aha, verstehe ... ;) ... Allerdings sagt mir das alles nichts, da ich mich doch auch in Zukunft mit Delphi 5 beschäftigen werde. Und da bleibt mir (will ich auf separate Komponenten verzichten) "nur" (in Anführungsstrichen, weil ich gern damit arbeite!) der MS-XML Parser.
Bei dem habe ich nur die eine Unit. Und ich hatte bisher keine Probleme damit. Okay, ich bin zwar auf eine installierte XML-Version von Microsoft angewiesen. Aber die Projekte, die das bisher nutzen, setzen das ohnehin voraus. Mein Help 2.0-Registrierungstool bspw.
MSCH - Sa 10.07.04 19:34
hat somit eher weniger mit dem Parser sondern mit deiner Delphi-Version zu tun. Gibts bei D5 kein TXMLDocument? Hab's zwar auch - allerdings nicht installiert (wie auch die vorversion 1-4 und BP 7.0).
Das ganze nennt sich übrigens Datenanbindungs-Experte. Hat den Vorteil, du musst nicht alles über "nodes" organisieren sondern hast normale "Variablen" entsprechend dem XML-Dokument. Ist etwas besser lesbar.
grez
msch
Muetze1 - Sa 10.07.04 23:09
Moin!
Nein, bis Delphi 5 gibt es das TXMLDocument nicht mit bei. Man kann es aus der ActiveX Komponente selber nachinstallieren. Da ich mit D5 hauptsächlich entwickle und auch mal XML brauchte und nicht den grossen Klotz von MS wollte, habe ich mir selber eine kleine XML Unit geschrieben die für meine Zwecke reichte. Ist sonst auf meiner HP zu finden, samt Delphi Hilfe Datei und Doku.
MfG
Muetze1
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!