AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein XML Delphi mehrere XML Dateien erstellen
Thema durchsuchen
Ansicht
Themen-Optionen

mehrere XML Dateien erstellen

Ein Thema von FlorianWolf · begonnen am 8. Okt 2008 · letzter Beitrag vom 8. Okt 2008
Antwort Antwort
FlorianWolf

Registriert seit: 8. Okt 2008
4 Beiträge
 
#1

mehrere XML Dateien erstellen

  Alt 8. Okt 2008, 11:25
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?
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#2

Re: mehrere XML Dateien erstellen

  Alt 8. Okt 2008, 11:50
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.
  Mit Zitat antworten Zitat
FlorianWolf

Registriert seit: 8. Okt 2008
4 Beiträge
 
#3

Re: mehrere XML Dateien erstellen

  Alt 8. Okt 2008, 11:58
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
  Mit Zitat antworten Zitat
Benutzerbild von Reinhardtinho
Reinhardtinho

Registriert seit: 26. Feb 2007
411 Beiträge
 
Delphi 5 Enterprise
 
#4

Re: mehrere XML Dateien erstellen

  Alt 8. Okt 2008, 12:05
Ich kenne die Komponente nicht, aber du musst wahrscheinlich den Inhalt wieder leeren/zurücksetzen.
Ich habe viel von meinem Geld für Alkohol, Weiber und schnelle Autos ausgegeben ... Den Rest habe ich einfach verpraßt.

George Best - 22.05.1946 - 25.11.2005 - nordirischer Fußballspieler
  Mit Zitat antworten Zitat
thabaker

Registriert seit: 1. Jul 2007
50 Beiträge
 
Turbo Delphi für Win32
 
#5

Re: mehrere XML Dateien erstellen

  Alt 8. Okt 2008, 12:20
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.
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#6

Re: mehrere XML Dateien erstellen

  Alt 8. Okt 2008, 12:28
Hallo,

ist zwar nicht sehr schön, aber hinter dem Speichern einfach ein
XMLDocument1.XML.Clear; einfügen, dann ist das XML wieder weg und kann neu aufgebaut werden.
  Mit Zitat antworten Zitat
FlorianWolf

Registriert seit: 8. Okt 2008
4 Beiträge
 
#7

Re: mehrere XML Dateien erstellen

  Alt 8. Okt 2008, 12:33
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.
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#8

Re: mehrere XML Dateien erstellen

  Alt 8. Okt 2008, 12:40
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.
  Mit Zitat antworten Zitat
FlorianWolf

Registriert seit: 8. Okt 2008
4 Beiträge
 
#9

Re: mehrere XML Dateien erstellen

  Alt 8. Okt 2008, 13:49
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.
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#10

Re: mehrere XML Dateien erstellen

  Alt 8. Okt 2008, 14:04
Hallo,
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
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:21 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