Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi XML; manipulieren ist ja kein Problem, aber ... (https://www.delphipraxis.net/7489-xml%3B-manipulieren-ist-ja-kein-problem-aber.html)

Ricane 13. Aug 2003 16:03


XML; manipulieren ist ja kein Problem, aber ...
 
Moin,

also das manipulieren, bzw. das arbeiten mit .xml Dateien ist ja Dank XMLDocument gar nicht so schwer. Aber wie kann man denn eine .xml Datei zur Laufzeit erstellen?!

Mit dem Befehl ...

Code:
Datamodule1.XMLDocument1.Create('C:\Datei.xml');
... macht er es auf jeden Fall nicht. Wenn man erstmal eine .xml Datei hat, die auch schon ihren Anfang, á la <?xml version ......> besitzt, ist das hinzufügen von z.B. Knoten ja nicht mehr das Ding ...

Weiß jemand Rat?

Ricane

MathiasSimmack 13. Aug 2003 16:33

Re: XML; manipulieren ist ja kein Problem, aber ...
 
Beim MS-XML-Parser geht´s recht einfach mit loadXML, der du den gewünschten (Anfangs-)XML-Code als String übergibst. Ich könnte mir vorstellen, dass XMLDocument etwas ähnliches anbietet. Sagt denn die Hilfe nichts darüber?

Create dient wohl eher dazu, eine Instanz des XML-Document-Objektes zu erzeugen.

Ricane 14. Aug 2003 08:07

Re: XML; manipulieren ist ja kein Problem, aber ...
 
Zitat:

Zitat von MathiasSimmack
Create dient wohl eher dazu, eine Instanz des XML-Document-Objektes zu erzeugen.

Es gibt bei XMLDocument 2x die Metohe CREATE. Einmal wird AOwner übergeben, und einmal AFileName...

Beim XMLDocument, gibt es zwei Load* Methoden, die aber beide auf einen Fehler laufen, wenn man nicht vorhandene Dateien angibt...


Grüsse,

Ricane

CalganX 14. Aug 2003 09:08

Re: XML; manipulieren ist ja kein Problem, aber ...
 
Hi,
du musst die Create-Methode verwenden mit dem AFileName. Ich vermute, dass dadurch die Datei auch erstellt wird.

Wenn alle Fäden reißen kannst du auch eine einfache TextFile-Variable nehmen und dann dir das Grundgerüst per writeln erstellen. Allerdings sollte man das nur machen, wenn das mit deinem XMLDocument nicht geht.

Btw MS XML halte ich für etwas einfacher bzw. logischer... :roll: ;)

Chris

Ricane 14. Aug 2003 10:35

Re: XML; manipulieren ist ja kein Problem, aber ...
 
Als DOMVendor benutze ich ja MSXML.

Aber es kann doch nicht so schwierig sein, eine XML Datei mit dem XMLDocument zu erstellen.

Im I-Net bzw. im Delphi Handbuch (oder Delphi Hilfe) gibt es auch keine klaren Hinweise...

Die Delphi Hilfe ist an der Stelle aber auch sehr(!) schwach. Es gibt für nix ein Beispiel!


Ricane

MathiasSimmack 14. Aug 2003 11:38

Re: XML; manipulieren ist ja kein Problem, aber ...
 
Warum sagst du das nicht gleich? IMHO bietet die XML-Komponente von Delphi6+ mehrere Möglichkeiten, von denen der Microsoft-Parser nur eine ist.

In dem Fall solltest du mal einen Blick in das PSDK werfen. Oder wenn dir das zu fett ist (~300meg Download), dann hole dir die aktuelle Version 4 SP2 von MS-XML. Ihr liegt die Doku auch bei. Da wirst du mit Sicherheit fündig, da du letztlich in Delphi "nur" die Typbibliothek von Microsoft benutzt.

Und in dem Fall gilt, wie ich schon schrieb:
Delphi-Quellcode:
xmldoc := CoDOMDocument40.Create;
{ ... }

xmldoc.loadXML('<Root><SubNode1><SubNode2/></SubNode1></Root>');

{ ... }
zum Anlegen einer neuen XML-Datei, die du dann mit
Delphi-Quellcode:
xmldoc.save('Pfad\Dateiname.xml');
speichern kannst. Das bezieht sich nun zwar vorrangig auf die schon angespochene Typbibliothek von Microsoft (s. auch Chakotays Tutorial), sollte aber mit der XML-Komponente ähnlich laufen.

btw: lkz schrieb in AUQ, dass es bei XMLDocument von add heißt, und nicht loadXML. Dazu kann ich nichts sagen; höchstens: ausprobieren! Aber ich denke, eine Doku müsste doch eigenlich dabei sein (bei Delphi). Ist doch immerhin eine Standardkomponente ab Version 6. Oder?

Ricane 14. Aug 2003 12:04

Re: XML; manipulieren ist ja kein Problem, aber ...
 
Zitat:

Zitat von MathiasSimmack
Delphi-Quellcode:
xmldoc := CoDOMDocument40.Create;
{ ... }
xmldoc.loadXML('<Root><SubNode1><SubNode2/></SubNode1></Root>');

{ ... }
zum Anlegen einer neuen XML-Datei, die du dann mit
Delphi-Quellcode:
xmldoc.save('Pfad\Dateiname.xml');

Wenn ich den Code zum anlegen probiere, also CoDOMDocument40.Create, dann sagt er mir nur das das ein unbekannter Bezeichner ist...
Als ich die Typenbibliothek msxml4.dll installieren wollte, sagte er mir, das sie bereit installiert ist, aber diese Datei die man, lt. dem Tutorial, einbinden soll, ist nicht vorhanden...

Ich habe einfach nur die Komponente XMLDocument in mein DataModule eingebunden und verwende folgende Sachen in der USES Liste:

Code:
XMLDOM, XMLIntf, XMLDoc;
... na ja und natürlich noch diese ganzen anderen Standard Uses Dinger wie Windows, Messages n´ Stuff...

Aber ich kriege es nicht hin...


Ricane

MathiasSimmack 14. Aug 2003 12:38

Re: XML; manipulieren ist ja kein Problem, aber ...
 
Chakotay hat´s beschrieben:
  1. MS XML installieren
  2. Delphi starten
  3. Menü "Projekt -> Typbibliothek importieren"
  4. Auswahl von "Microsoft XML 4.0" (oder was immer da steht)
  5. "Create Unit"
Dann findest du eine MSXML_TLB2.pas ... hm ... irgendwo ... Die bindest du ein, das reicht für den MS-XML-Parser. Weitere Beispiele dazu gibt´s hier in der DP genug. Und im genannten Tut steht ja auch was dazu.

CalganX 14. Aug 2003 13:14

Re: XML; manipulieren ist ja kein Problem, aber ...
 
Standardmäßig befindet sich die Unit dann im Lib-Verzeichnis.

Chris

Ricane 14. Aug 2003 14:10

Re: XML; manipulieren ist ja kein Problem, aber ...
 
Ich habe das ganze jetzt mit dem XMLDocument, ohne Abstriche machen zu müssen, gelöst.

Zwar "betrüge" ich die .XML Datei etwas, weil ich den "Grundstein" per TextFile Bearbeitung lege und erst dann das XMLDocument einschalte, aber das stört mich wenig... :D


Ricane

sakura 14. Aug 2003 14:18

Re: XML; manipulieren ist ja kein Problem, aber ...
 
Besser spät als nie ;-)
Delphi-Quellcode:
  Datamodule1.XMLDocument1.Active := False;
  Datamodule1.XMLDocument1.XML.Text := '<Root><SubNode1><SubNode2/></SubNode1></Root>';
  Datamodule1.XMLDocument1.Active := True;
Das sollte gehen, um ein neues Dokument zu laden.

...:cat:....

lkz633 14. Aug 2003 17:01

Re: XML; manipulieren ist ja kein Problem, aber ...
 
Die gleichen Probleme habe ich gerade auch.

Es muss doch irgendwie moeglich sein, mit createelement und addchild dies hinzubekommen.

Ausserdem moechte ich z.B eine bestehende Datei laden und dann Knoten hinzufuegen.

Weiss niemand wie dies mit XMLDocument geht?

Gruss lkz633

Ricane 15. Aug 2003 07:28

Re: XML; manipulieren ist ja kein Problem, aber ...
 
Zitat:

Zitat von lkz633
Es muss doch irgendwie moeglich sein, mit createelement und addchild dies hinzubekommen.

Dieser Fetzten Code, macht genau das. Er erstellt im ersten "Block" das Grundgerüst für eine XML Datei (3+4 Zeile). Dann wird der erste Knoten (KnotenEins) erstellt, der bei mir den Tabellennamen gekriegt hat (cbTabellen.Text). Außerdem bekommt er als Attribut noch den Servernamen, der in der String Variable "Server" liegt.

Dann werden alle Inhalte der Tabelle per For Schleife, in die Datei geschrieben. UnterKnoten wird jeweils der Name von der akt. Spalte zugewiesen, und der Spalteeintrag ist dann natürlich der Text aus dem Feld. Nach jeder Reihe muss der erste Knoten (KnotenEins) wieder geschloßen werden, weil es sonst einen Anzeigefehler gibt.

Code:
  Datamodule1.XMLDocument1.Active := False;

  DataModule1.XMLDocument1.XML.Text := '';
  Datamodule1.XMLDocument1.XML.Text := '<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>';
  Datamodule1.XMLDocument1.XML.Text := Datamodule1.XMLDocument1.XML.Text + '<Tabellen-Abbild></Tabellen-Abbild>';
  Datamodule1.XMLDocument1.Active := True;

  KnotenEins := DataModule1.XMLDocument1.DocumentElement.AddChild(cbTabellen.Text);
  KnotenEins.Attributes['Server'] := Server;

  For X := 1 To DataModule1.ADODataSet1.RecordCount - 1 Do
  Begin
    For I := 0 To grdHaupt.Columns.Count - 1 Do
    Begin
      DataModule1.ADODataSet1.RecNo := X;
      UnterKnoten := KnotenEins.AddChild(grdHaupt.Fields[I].FieldName);
      UnterKnoten.Text := grdHaupt.Fields[I].Text;
    End;
    KnotenEins := DataModule1.XMLDocument1.DocumentElement.AddChild(cbTabellen.Text)
  End;
Zitat:

Zitat von lkz633
Ausserdem moechte ich z.B eine bestehende Datei laden und dann Knoten hinzufuegen.

Code:
var
    NewStock: IXMLNode;
    ValueNode: IXMLNode;
Begin

  DataModule1.XMLDocument1.FileName := Datei;
  NewStock :=  DataModule1.XMLDocument1.FileName := Datei.DocumentElement.AddChild('stock');
  NewStock.Attributes['exchange'] := 'NASDAQ';
  ValueNode := NewStock.AddChild('name');
  ValueNode.Text := 'Cisco Systems'
  ValueNode := NewStock.AddChild('price');
  ValueNode.Text := '62.375';
  ValueNode := NewStock.AddChild('symbol');
  ValueNode.Text := 'CSCO';
  ValueNode := NewStock.AddChild('shares');

  ValueNode.Text := '25';
End;
Und ganz wichtig, am ende IMMER

Code:
  DataModule1.XMLDocument1.SaveToFile(Datei)
sichern... sonst sieht man nüscht ...

Grüsse und ich hoffe das hilft Dir weiter,

Ricane

lkz633 15. Aug 2003 07:57

Re: XML; manipulieren ist ja kein Problem, aber ...
 
Hallo,

erstmal vielen vieln Dank fuer deine Hilfe!

Zitat:

Zitat von Ricane
[code]
Datamodule1.XMLDocument1.XML.Text := '<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>';
Datamodule1.XMLDocument1.XML.Text := Datamodule1.XMLDocument1.XML.Text + '<Tabellen-Abbild></Tabellen-Abbild>';

Ich glaube da hast du dich selber ver.... Du loescht den Text wieder, ein "xml version..." wird dann bei mir automatisch eingefuegt. Es muesste xml.add heissen :-)

Habe noch ein paar Fragen, weiter werden folgen :D :

1) Wann genau werden Tags automatisch geschlossen? Addchild hat bei mir nur den schliessenden Tag erzeugt, den oeffnenden nur, wenn ich auch einen Unterknoten erstellt habe. Was mache ich, wenn ich keine Unterknoten habe, aber den Tag brauche, um z.B eine gewisse Vorgabe zu erfuellen

2) Kann das DocumentElement nur mit XML.add erstellt werden?

3) Wofuer ist createelement da, wenn ich es gar nicht brauche? Was macht es?

4) Wenn ich die Datei jetzt oeffne, steht alles in einer Zeile. Kann ich es irgednwie so hinbekommen, dass wenn ich die Datei in einem XML Editor anscchaue, die Datei auch so formatiert ist wie eine XML Datei, also mit einruecken usw?

5) Gibt es eine Moeglichkeit, Kommentare einzufuegen, oder geht dies nur mit Writeln


Nochmals vielen Dank

lkz633

MathiasSimmack 15. Aug 2003 09:23

Re: XML; manipulieren ist ja kein Problem, aber ...
 
Zitat:

Zitat von lkz633
Ich glaube da hast du dich selber ver.... Du loescht den Text wieder, ein "xml version..." wird dann bei mir automatisch eingefuegt. Es muesste xml.add heissen :-)

Auch auf die Gefahr hin, dich missverstanden zu haben, aber da wird nichts gelöscht, oder ist dir das Plus entgangen?
Zitat:

Code:
Datamodule1.XMLDocument1.XML.Text := '<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>';
Datamodule1.XMLDocument1.XML.Text := [b]Datamodule1.XMLDocument1.XML.Text +[/b]
  '<Tabellen-Abbild></Tabellen-Abbild>';

Zitat:

1) Wann genau werden Tags automatisch geschlossen? Addchild hat bei mir nur den schliessenden Tag erzeugt, den oeffnenden nur, wenn ich auch einen Unterknoten erstellt habe. Was mache ich, wenn ich keine Unterknoten habe, aber den Tag brauche, um z.B eine gewisse Vorgabe zu erfuellen
Jeder XML-Parser erzeugt (hoffentlich!) "well-formed" Dokumente. Ein Knoten ist so
Code:
<SubNode1></SubNode1>
und so
Code:
<SubNode1/>
geschlossen und gültig. Wenn du die XML-Datei im Code erstellst, dann gib den Tag in der von dir gewünschten Form an.

Zitat:

4) Wenn ich die Datei jetzt oeffne, steht alles in einer Zeile. Kann ich es irgednwie so hinbekommen, dass wenn ich die Datei in einem XML Editor anscchaue, die Datei auch so formatiert ist wie eine XML Datei, also mit einruecken usw?
Da gibt es sicher eine passende Eigenschaft. Bei MS-XML heißt sie (glaube ich) "preservedWhiteSpace". (@sakura?)

Zitat:

5) Gibt es eine Moeglichkeit, Kommentare einzufuegen, oder geht dies nur mit Writeln
Igitt! Ein Kommentar ist auch ein XML-Element, und es sollte sich mit einer entsprechenden Funktion auch einer erzeugen lassen! (wie gehabt: @sakura? :wink:)

lkz633 15. Aug 2003 09:42

Re: XML; manipulieren ist ja kein Problem, aber ...
 
Zitat:

Zitat von MathiasSimmack
Auch auf die Gefahr hin, dich missverstanden zu haben, aber da wird nichts gelöscht, oder ist dir das Plus entgangen?

Oops :oops:

Zitat:

Zitat von MathiasSimmack
Jeder XML-Parser erzeugt (hoffentlich!) "well-formed" Dokumente. Ein Knoten ist so
Code:
<SubNode1></SubNode1>
und so
Code:
<SubNode1/>
geschlossen und gültig.

Danke! Das sehe ich erst jetzt, dass der Slash bei diesen Knoten hinten steht. Super, wieder was gelernt.

Zitat:

Zitat von lkz633
so formatiert ist wie eine XML Datei, also mit einruecken usw?

Des Raetsels Loesung war xml.Options:= [doNodeAutoIndent] ;

Nochmals danke, das war sehr hilfreich

Gruss lkz633


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:09 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