Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   XML (https://www.delphipraxis.net/46-xml/)
-   -   Delphi Wie an vorhandenen Knoten neuen Kindknoten anhängen? (https://www.delphipraxis.net/46637-wie-vorhandenen-knoten-neuen-kindknoten-anhaengen.html)

toko 28. Mai 2005 20:30


Wie an vorhandenen Knoten neuen Kindknoten anhängen?
 
Hallo,

ich lese aus einer xml-Datei Datensätze aus und möchte diese verändern. Mein Problem ist dabei, wie ich an einem vorhandenen Kindknoten, der nicht der letzte ist, einen neuen Kindknoten anhänge.

Mit
Delphi-Quellcode:
newSub1 := xmlDoc.createElement('Kind in erster Ordnung');
newSub2 := xmlDoc.createElement('Kind in zweiter Ordnung');
newSub2.text := 'bla bla';
newSub1.appendChild(newSub2);
xmlDoc.documentElement.appendChild(newSub1);
xmlDoc.save(frmMain.xmlfile);
hänge ich an einer XML-Datei neue Datensätze an.

Wenn ich jetzt also mittendrin an einem vorhandenen Knoten einen Kindknoten hinzufügen möchte, müsste ich doch nach diesem suchen, z.B. mit "select Nodes". Ich weiß dann aber nicht, wie ich diesen Konten aufgreife und mit diesem arbeiten kann?

Bin sehr froh, wenn mir Jemand helfen kann.

Gruß

MathiasSimmack 28. Mai 2005 21:51

Re: Wie an vorhandenen Knoten neuen Kindknoten anhängen?
 
Zitat:

Zitat von toko
Wenn ich jetzt also mittendrin an einem vorhandenen Knoten einen Kindknoten hinzufügen möchte, müsste ich doch nach diesem suchen, z.B. mit "select Nodes".

Eigentlich mit "selectSingleNode", wenn´s nur einer ist. :stupid:

Zitat:

Ich weiß dann aber nicht, wie ich diesen Konten aufgreife und mit diesem arbeiten kann?
Wie auch mit deinem gezeigten Beispiel:
Delphi-Quellcode:
// <IrgendwasmitCD>
//   <cd id="1"></cd>
//   <cd id="2"></cd>
//   <cd id="3"></cd>
// </IrgendwasmitCD>

// sucht den <cd>-Knoten mit dem Attribut id="1"
node := xmlDoc.selectSingleNode('/IrgendwasmitCD/cd[@id="1"]');

if node <> nil then
begin
  newNode := xmldoc.createElement('bla');
  node.appendChild(newNode);
end;
Mal in die Fundstücke hier im Forum gucken, da findest du so was recht häufig. ;)

toko 28. Mai 2005 22:39

Re: Wie an vorhandenen Knoten neuen Kindknoten anhängen?
 
Hallo,

das mit den Attributen habe ich jetzt anders geregelt
XML-Code:
<cdorganizer>
   <cd>
      <cdid>1</cdid>
      <cdtitel>testtitel1</cdtitel>
      <interpret>testinterpret1</interpret>
      <genre>testgenre1</genre>
      <track>
         <trackid>1</trackid>
         <tracktitel>track 1</tracktitel>
         <dauer>3:11:07</dauer>
      </track>
   </cd>
</cdorganizer>
mit
Code:
tracks := XMLDoc.documentElement.selectNodes('cd['+ IntToStr(globAktCDID) +']/track');
bekomme ich die Tracks, aber auch nur weil zufällig die cdid mit der Reihenfolge in der XML-Datei übereinstimmt.
Ich bin in der MSXML-Hilfe nicht fündig geworden, wie ich attribute setzen kann.

Bei
Delphi-Quellcode:
procedure TfrmCD.btnOKClick(Sender: TObject);
var
  newsub,
  newcd : IXMLDOMNode;
  newattribute : IXMLDOMAttribute;
begin
  newattribute := frmMain.xmlDoc.createAttribute('id');
  newattribute.value := '1';
  newcd := frmMain.xmlDoc.createElement('cd').setAttributeNode(newattribute);


  newsub := frmMain.xmlDoc.createElement('cdid');
  newsub.text := IntToStr(frmMain.strgrdCDListe.RowCount);
  newcd.appendChild(newsub);

  newsub := frmMain.xmlDoc.createElement('cdtitel');
  newsub.text := edtTitel.Text;
  newcd.appendChild(newsub);

  newsub := frmMain.xmlDoc.createElement('interpret');
  newsub.text := edtInterpret.Text;
  newcd.appendChild(newsub);

  newsub := frmMain.xmlDoc.createElement('genre');
  newsub.text := edtGenre.Text;
  newcd.appendChild(newsub);

  frmMain.xmlDoc.documentElement.appendChild(newcd);
  frmMain.xmlDoc.save(frmMain.xmlfile);

  close;
end.
bekomme ich eine Exception der Klasse EAccessViolation.

toko 28. Mai 2005 23:30

Re: Wie an vorhandenen Knoten neuen Kindknoten anhängen?
 
Hallo,

ich habs hier gerade im Forum gefunden. Ich hatte noch einen Typfehler. Bei mir war newcd und newsub nicht vom Typ IXMLDOMElement sondern vom Typ IXMLDOMNode.

funzt jetzt aber :thumb:

gruß


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