Autor Beitrag
Schumi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 33

Win XP, Linux
D7 Prof., D2006 Entpr.
BeitragVerfasst: Di 24.05.05 08:38 
Hallo zusammen,

habe eine Frage zu der Erzeugung einer XML-Datei. Der folgende Code erzeugt eine XML-Datei wie gewünscht.

ausblenden volle Höhe 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:
procedure Initialisierung;
var logfile     : string;
    xmldoc      : IXMLDocument;
    datei       : IXMLNode;
    elem        : IXMLNode;
begin
  // Logfile vorbereiten
  logfile:='C:\Fortras6-Import.log';

  // XML-Datei vorbereiten
  xmldoc:=NewXMLDocument;

  datei:=xmldoc.AddChild('Datei');

  datei:=xmldoc.ChildNodes['Datei'].AddChild('Kd-Nummer');
  datei.Text:='0000008';
  datei:=xmldoc.ChildNodes['Datei'].AddChild('Datum');
  datei.Text:='2005-05-23';
  datei:=xmldoc.ChildNodes['Datei'].AddChild('Kommentar');
  datei.Text:='Konvertierte Datei';

  elem:=xmldoc.ChildNodes['Datei'].AddChild('Auftrag');
  elem:=xmldoc.ChildNodes['Datei'].ChildNodes['Auftrag'].AddChild('Kopf');

  elem:=xmldoc.ChildNodes['Datei'].ChildNodes['Auftrag'].ChildNodes['Kopf'].AddChild('Auftrag-Nr');
  elem.Text:='123456';
  elem:=xmldoc.ChildNodes['Datei'].ChildNodes['Auftrag'].ChildNodes['Kopf'].AddChild('Liefertermin');
  elem.Text:='01.06.05';

  xmldoc.SaveToFile('C:\test.xml');

end;


Heraus kommt folgende XML-Datei:

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
<?xml version="1.0"?>
<Datei>
  <Kd-Nummer>0000008</Kd-Nummer>
  <Datum>2005-05-23</Datum>
  <Kommentar>Konvertierte Datei</Kommentar>
  <Auftrag>
    <Kopf>
      <Auftrag-Nr>123457</Auftrag-Nr>
      <Liefertermin>02.06.05</Liefertermin>
    </Kopf>
  </Auftrag>
</Datei>


Das ist soweit genau das, was ich auch haben möchte. Aber wie füge ich jetzt einen weiteren Auftrag mit dem gleichen Tag <Auftrag> ... </Auftrag> ein? Trage ich auf gleiche Weise wie oben einen zusätzlichen Auftrag ein, werden die alten Werte überschrieben!

Vielen Dank für eure Hilfe!
Grendel
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 443

Gentoo Linux, MacOS X, Win 2000
D5 Ent, D7 Ent, Lazarus, Anjuta, MonoDevelop
BeitragVerfasst: Di 24.05.05 08:53 
Wieso probierst Du es nicht einfach aus? Dürfte kaum länger dauern als hier anzufragen.
Wie auch immer. Ja, Du fügst weitere Knoten genau so an wie die bisherigen. Und nein, es wird dabei nichts überbügelt.

Bis neulich ...
Schumi Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 33

Win XP, Linux
D7 Prof., D2006 Entpr.
BeitragVerfasst: Di 24.05.05 09:05 
Hallo Grendel,

ich habe es bereits auf verschiedene Art und Weise probiert. Unter anderem auch genau so, wie der erste "Auftrag" eingetragen wurde. Mit dem Erfolg, dass ich nur einen, nämlich den zweiten Datensatz in der fertigen Datei habe.

Vielleicht habe ich mich auch ein wenig falsch ausgedrückt, die Tags für die einzelnen Aufträge sind immer gleich, also

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
.
.
.
  <Auftrag>
    <Kopf>
      <Auftrag-Nr>123445</Auftrag-Nr>
      <Liefertermin>02.06.05</Liefertermin>
    </Kopf>
  </Auftrag>
  <Auftrag>
    <Kopf>
      <Auftrag-Nr>123457</Auftrag-Nr>
      <Liefertermin>25.07.05</Liefertermin>
    </Kopf>
  </Auftrag>
.
.
.
Grendel
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 443

Gentoo Linux, MacOS X, Win 2000
D5 Ent, D7 Ent, Lazarus, Anjuta, MonoDevelop
BeitragVerfasst: Di 24.05.05 09:12 
Schon klar, daß die Tags gleich sein sollen aber ich versteh das Problem trotzdem nicht.
Du kannst an den Root-Knoten so viele Auftrags-Knoten hängen wie Du willst.

Zeig mal Deinen Code, der nicht das gewünschte Ergebnis bringt.

Bis neulich ...
Schumi Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 33

Win XP, Linux
D7 Prof., D2006 Entpr.
BeitragVerfasst: Di 24.05.05 09:22 
Habe jetzt den Code wie folgt erweitert:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
...

  datei.Text:='Konvertierte Datei';

  elem:=xmldoc.ChildNodes['Datei'].AddChild('Auftrag');
  elem:=xmldoc.ChildNodes['Datei'].ChildNodes['Auftrag'].AddChild('Kopf');

  elem:=xmldoc.ChildNodes['Datei'].ChildNodes['Auftrag'].ChildNodes['Kopf'].AddChild('Auftrag-Nr');
  elem.Text:='123456';
  elem:=xmldoc.ChildNodes['Datei'].ChildNodes['Auftrag'].ChildNodes['Kopf'].AddChild('Liefertermin');
  elem.Text:='01.06.05';

  elem:=xmldoc.ChildNodes['Datei'].AddChild('Auftrag');
  elem:=xmldoc.ChildNodes['Datei'].ChildNodes['Auftrag'].AddChild('Kopf');

  elem:=xmldoc.ChildNodes['Datei'].ChildNodes['Auftrag'].ChildNodes['Kopf'].AddChild('Auftrag-Nr');
  elem.Text:='123489';
  elem:=xmldoc.ChildNodes['Datei'].ChildNodes['Auftrag'].ChildNodes['Kopf'].AddChild('Liefertermin');
  elem.Text:='01.12.05';

  xmldoc.SaveToFile('C:\test.xml');


...und heraus kommt das hier:

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
<?xml version="1.0"?>
<Datei>
  <Kd-Nummer>0000008</Kd-Nummer>
  <Datum>2005-05-23</Datum>
  <Kommentar>Konvertierte Datei</Kommentar>
  <Auftrag>
    <Kopf>
      <Auftrag-Nr>123456</Auftrag-Nr>
      <Liefertermin>01.06.05</Liefertermin>
      <Auftrag-Nr>123489</Auftrag-Nr>
      <Liefertermin>01.12.05</Liefertermin>
    </Kopf>
    <Kopf/>
      </Auftrag><Auftrag/>
</Datei>
Grendel
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 443

Gentoo Linux, MacOS X, Win 2000
D5 Ent, D7 Ent, Lazarus, Anjuta, MonoDevelop
BeitragVerfasst: Di 24.05.05 09:32 
Ja is klar. Das Problem ist, daß Du die ChildNodes über die Namen ansprichst.

Wenn es unterhalb von "Datei" mehrere "Auftrag" gibt liefert das hier:
ausblenden Delphi-Quelltext
1:
xmldoc.ChildNodes['Datei'].ChildNodes['Auftrag']...					

immer nur den ersten.

Mach in etwa so (ungetestet):
Das hier:
elem:=xmldoc.ChildNodes['Datei'].AddChild('Auftrag'); weist "elem" ja den neuen Knoten "Auftrag" zu.
anstatt:
ausblenden Delphi-Quelltext
1:
xmldoc.ChildNodes['Datei'].ChildNodes['Auftrag'].AddChild('Kopf');					

kannst Du über "elem" gehen. Also so:
ausblenden Delphi-Quelltext
1:
2:
elem := xmldoc.ChildNodes['Datei'].AddChild('Auftrag');
elem.AddChild('Kopf');

Dann mach auch die Zuweisung an "elem" Sinn, da es sonst niemals gebraucht wird.

Bis neulich ...
Schumi Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 33

Win XP, Linux
D7 Prof., D2006 Entpr.
BeitragVerfasst: Mi 25.05.05 10:28 
Hallo Grendel,

damit hast Du mir sehr auf die Sprünge geholfen!

Vielen Dank!