Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   XML (https://www.delphipraxis.net/46-xml/)
-   -   Delphi mehrere XML Dateien erstellen (https://www.delphipraxis.net/122018-mehrere-xml-dateien-erstellen.html)

FlorianWolf 8. Okt 2008 10:25


mehrere XML Dateien erstellen
 
Ich habe ein Problem beim erstellen einer XML-Datei.
Das ganze Thema XML ist für mich komplettes Neuland.

Ich habe die Anforderung aus meiner Software mehrere XML-Dateien anzulegen mit immer dem gleichen Aufbau.
Den Aufbau habe ich. Eine Datei kann ich auch Fehlerfrei erstellen.
Wenn ich aber die gleiche Funktion noch einmal nutze um eine zweite Datei zu erstellen, bekomme ich eine Fehlermeldung:
"Only one top level element is allowed in an XML document"

Delphi-Quellcode:
procedure TForm1.Button9Click(Sender: TObject);
var
  root                      :IXMLNode;
  node                      :IXMLNode;
  unterknoten               :IXMLNode;
  cData                     :IDOMCDATASection;
  x, y                      :integer;
begin
  if SaveDialog1.Execute then begin
    XMLDocument1.Active := true;
    XMLDocument1.Create(SaveDialog1.FileName);
    XMLDocument1.Version := '1.0';
    XMLDocument1.Encoding := 'iso-8859-1';

    root := XMLDocument1.AddChild('Baugruppe');       //<---- Hier tritt beim erstellen der zweiten XML-Datei ein Fehler auf!
    node := root.AddChild('Part-ID');
    cData := XMLDocument1.DOMDocument.createCDATASection(LabeledEdit1.Text);
    node.DOMNode.appendChild(cData);

    node := root.AddChild('FA-ID');
    node.Text := LabeledEdit2.Text;
    node := root.AddChild('Part-Nr');
    node.Text := Vari.Pruefung.SoftwareVersion;
    node := root.AddChild('Strom');
    node.Text := IntToStr(Vari.Pruefung.Strom);

    XMLDocument1.SaveToFile(SaveDialog1.FileName);
  end;
end;
Bei dem ersten Durchgang füge ich dem XMLDocument1 mit AddChild ja ein top level element zu. Soweit ich weiß, darf man das nur einmal in einer XML Datei tun.
Was muss ich tun, damit ich, wenn ich die nächste Datei erstellen will wieder diesen Eintrag machen kann?
Muss ich das XMLDocument1 noch irgendwie schließen nach dem speichern?

nahpets 8. Okt 2008 10:50

Re: mehrere XML Dateien erstellen
 
Hallo,

schau mal in der Hilfe nach, was XMLDocument1.Active := true; macht, ich tippe darauf, dass Dir ein XMLDocument1.Active := false; nach dem Speichern fehlt.

FlorianWolf 8. Okt 2008 10:58

Re: mehrere XML Dateien erstellen
 
Zitat:

Zitat von nahpets
Hallo,

schau mal in der Hilfe nach, was XMLDocument1.Active := true; macht, ich tippe darauf, dass Dir ein XMLDocument1.Active := false; nach dem Speichern fehlt.

Das habe ich ausprobiert und der Fehler bleibt genau gleich :-(

Reinhardtinho 8. Okt 2008 11:05

Re: mehrere XML Dateien erstellen
 
Ich kenne die Komponente nicht, aber du musst wahrscheinlich den Inhalt wieder leeren/zurücksetzen.

thabaker 8. Okt 2008 11:20

Re: mehrere XML Dateien erstellen
 
Reinhardtinho hat Recht, es sieht so aus als sei bei deiner Komponente die Idee, für jede XML Datei eine eigene Komponente zu verwenden.
Da du im ersten Durchlauf ein Top-Level-Element erstellst "Baugruppe", und der Inhalt der Komponente nach dem Speichern nicht weiter verändert wird, crashed es beim zweiten Aufruf. Denn in der Komponente ist immer noch das Top-Level-Element "Baugruppe" vom ersten Mal vorhanden.
Lösung ist das Leeren des XML-Baums in der Komponente, oder die XMLDocument-Instanzen dynamisch zu erzeugen.

nahpets 8. Okt 2008 11:28

Re: mehrere XML Dateien erstellen
 
Hallo,

ist zwar nicht sehr schön, aber hinter dem Speichern einfach ein
Delphi-Quellcode:
XMLDocument1.XML.Clear;
einfügen, dann ist das XML wieder weg und kann neu aufgebaut werden.

FlorianWolf 8. Okt 2008 11:33

Re: mehrere XML Dateien erstellen
 
Danke für die vielen Tipps.
Ich habe es mit XMLDocument1.XML.Clear versucht, aber es ist immer noch das gleiche Problem.
Wenn jemand eine ganz andere Idee hat bin ich dafür auch dankbar.

nahpets 8. Okt 2008 11:40

Re: mehrere XML Dateien erstellen
 
Zitat:

Zitat von FlorianWolf
Danke für die vielen Tipps.
Ich habe es mit XMLDocument1.XML.Clear versucht, aber es ist immer noch das gleiche Problem.
Wenn jemand eine ganz andere Idee hat bin ich dafür auch dankbar.

Sorry, aber das verstehe ich nicht, habe mir ein Programm gebaut, in das ich Deinen Quelltext kopiert habe und dann die übrigen Komponenten noch hinzugefügt habe. Und mit dem XML.Clear tritt kein Fehler auf. Es sieht jetzt also so aus:
Delphi-Quellcode:
procedure TForm1.Button9Click(Sender: TObject);
var
  root                      :IXMLNode;
  node                      :IXMLNode;
  unterknoten               :IXMLNode;
  cData                     :IDOMCDATASection;
  x, y                      :integer;
begin
  if SaveDialog1.Execute then begin
    XMLDocument1.Active := true;
    XMLDocument1.Create(SaveDialog1.FileName);
    XMLDocument1.Version := '1.0';
    XMLDocument1.Encoding := 'iso-8859-1';

    root := XMLDocument1.AddChild('Baugruppe');
    node := root.AddChild('Part-ID');
    cData := XMLDocument1.DOMDocument.createCDATASection(LabeledEdit1.Text);
    node.DOMNode.appendChild(cData);

    node := root.AddChild('FA-ID');
    node.Text := LabeledEdit2.Text;
    node := root.AddChild('Part-Nr');
    node.Text := Vari.Pruefung.SoftwareVersion;
    node := root.AddChild('Strom');
    node.Text := IntToStr(Vari.Pruefung.Strom);

    XMLDocument1.SaveToFile(SaveDialog1.FileName);
    XMLDocument1.XML.Clear;
  end;
end;
Und nun kann ich beim Klick auf den Button jedesmal ohne Fehlermeldung eine Datei erstellen.

FlorianWolf 8. Okt 2008 12:49

Re: mehrere XML Dateien erstellen
 
Ich muss sagen, ich verstehe es auch nicht. Aber diesmal verstehe ich nicht, wieso das jetzt funktioniert.
Auf jeden Fall vielen Dank für die Tipps. Mit dem XML.Clear hat es dann doch noch geklappt.

nahpets 8. Okt 2008 13:04

Re: mehrere XML Dateien erstellen
 
Hallo,
Zitat:

Zitat von FlorianWolf
Ich muss sagen, ich verstehe es auch nicht. Aber diesmal verstehe ich nicht, wieso das jetzt funktioniert.
Auf jeden Fall vielen Dank für die Tipps. Mit dem XML.Clear hat es dann doch noch geklappt.

ich versuch's mal zu erklären:
Durch AddChild, AppendChild ... wird eine XML-Struktur aufgebaut. Dies ist eine "baumähnliche" Struktur.
XML selbst ist Text und dieser Text wird durch das Attribut XML (einer Stringliste) repräsentiert.
Allem Anschein nach, kann man das XML auf zwei Wegen erstellen: Durch Aufbau der Baumstruktur oder durch das Erstellen von Text.
Und es ist wohl so, dass das Löschen des, durch den Aufbau der Baumstruktur entstandenen, Textes auch diese Baumstruktur entfernt.
Quasi: alle Wege führen nach Rom und mindestens zwei zum XML :wink:


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:02 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz