Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   XML (https://www.delphipraxis.net/46-xml/)
-   -   Delphi XML Verarbeitung variabel machen (https://www.delphipraxis.net/112959-xml-verarbeitung-variabel-machen.html)

Yheeky 30. Apr 2008 08:09


XML Verarbeitung variabel machen
 
Hey,

ich habe vor einiger Zeit schonmal eine Frage gestellt, wie ich ein XML Dokument auslese.

Nun habe ich nochmal eine erweiterte Frage:

Mit diesem Code erhalte ich meine notwendigen Daten:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var xml : TXMLDocument;
    CNode                    : IXMLNode;
    CdNode                   : IXMLNode;
    PNode                    : IXMLNode;
    i,j,k                    : Integer;

begin
XML := TXMLDocument.Create(nil);
XML.XML.Text := Memo1.Lines.Text;
XML.Options := [doNodeAutoCreate,doAutoSave];
XML.Active:=true;

for i:=0 to XML.ChildNodes.Count-1 do
  begin
    for j:=0 to XML.ChildNodes[i].ChildNodes.Count-1 do
    begin
      CdNode:=XML.ChildNodes[i].ChildNodes[j];
      if CdNode.NodeName='computerdaten' then begin
        for k:=0 to CdNode.ChildNodes.Count-1 do
        begin
          PNode:=CdNode.ChildNodes[k];
          if PNode.NodeName='mainboard' then ShowMessage(PNode.NodeValue);  // deine Variable

        end;
      end;
    end;
  end;

end;
...aber durch die beiden for-Schleifen, bin ich auf folgende Struktur angewiesen:

XML-Code:
<computer>
   <computerdaten>
      <mainboard>Asus</mainboard>
      <cpu>Athlon X2 6000+</cpu>
      <ram>2 GB</ram>
      <festplatte>160 GB</festplatte>
   </computerdaten>
   <computerdaten>
      <mainboard>MSI</mainboard>
      <cpu>Intel QuadCore</cpu>
      <ram>4 GB</ram>
      <festplatte>500 GB</festplatte>
   </computerdaten>
</computer>
Eine Struktur wie diese hier funktioniert da nicht:
XML-Code:
<computer>
   <computerdaten>
      <gehaeuse>
         <mainboard>Asus</mainboard>
         <cpu>Athlon X2 6000+</cpu>
         <ram>2 GB</ram>
         <festplatte>160 GB</festplatte>
      </gehaeuse>
   </computerdaten>
   <computerdaten>
      <gehaeuse>
         <mainboard>MSI</mainboard>
         <cpu>Intel QuadCore</cpu>
         <ram>4 GB</ram>
         <festplatte>500 GB</festplatte>
      </gehaeuse>
   </computerdaten>
</computer>
Wie kann ich meinen Code oben (den mit den for-Schleifen) variabel machen, dass ich auch andere Strukturen auslesen kann? Gibt doch Programme die zeigen das alles z.B. in einer TreeView an...die müssen sowas ja auch können.

Ich hoffe mir kann jemand helfen.

Danke.

sx2008 12. Mai 2008 05:14

Re: XML Verarbeitung variabel machen
 
Ganz einfach, du musst das rekursiv programmieren.
Schreib eine Prozedur, die einen TreeNode und ein XMLElement als Parameter entgegennimmt.
Delphi-Quellcode:
procedure ShowNode(parent:TTreeNode; element:XMLElement1);
var
  newnode : TTreeNode;
begin
  // pseudocode - soll nur das Prinzip zeigen
  newnode := parent.AddChildNode(element.Name1);
  // Schleife über alle Attribute
  for i:=0 to element.AttributCount-1 do
    newnode.AddChildNode(element.Attribute[i].Name + '=' + element.Attribute[i].Value);
  // Schleife über alle Child-Elemente
  for i:=0 to element.ChildCount-1 do
    ShowNode(newnode, element.ChildNodes[i]);  // der rekursive Aufruf
end;
PS: es gibt noch andere Möglichkeiten; wenn's noch aktuell ist, dann frag ruhig...

MathiasSimmack 12. Mai 2008 07:44

Re: XML Verarbeitung variabel machen
 
Ich bringe Hier im Forum suchenXPath ins Spiel, weil man damit quasi in einem Rutsch die relevanten Knoten enthält und sich den rekursiven Ansatz komplett spart. Das ist der Vorteil. Der Nachteil ist, dass die XML-Datei komplett im Speicher hängt. Wenn sie nicht zu groß ist, dürfte das aber egal sein.


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