Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi XML Dateien auslesen (https://www.delphipraxis.net/112149-xml-dateien-auslesen.html)

Yheeky 15. Apr 2008 22:49


XML Dateien auslesen
 
Hi,

ich habe eine Memo mit folgendem (gekürzten) XML-Code:

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>
Wie kann ich z.B. über die Komponente JVSimpleXML diese Daten in eine ListView mit 3 Columns (Index, Key und Value) auslesen?
Habe es nur geschafft, die beiden tags "computerdaten" auszulesen.

Wäre super, wenn mir jemand helfen könnte. Gerne auch mit ne anderen Verarbeitungsmöglichkeit als über die Komponente JVSimpleXML.

Danke!

Centrii 16. Apr 2008 07:54

Re: XML Dateien auslesen
 
Hallo Christian,

das JvSimpleXML kenne ich nicht, aber du musst deine Childs durchgehen und dann die Attribute, bzw. Values abfragen.

Beispiel:
Delphi-Quellcode:
var XML                      : IXMLDocument;
    mNode                    : IXMLNode;
    eNode                    : IXMLNode;
    opNode                   : IXMLNode;
    arNode                   : IXMLNode;
    dNode                    : IXMLNode;
    sNode                    : IXMLNode;
    i,j,k,m,n,o,p            : Integer;
begin
  XML:=NewXMLDocument;
  XML.XML.Text:=XMLCode;
  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
      eNode:=XML.ChildNodes[i].ChildNodes[j];
      if eNode.NodeName='equipment' then begin
        for k:=0 to eNode.ChildNodes.Count-1 do
        begin
          if eNode.ChildNodes[k].NodeName='elements' then
          begin
            for m:=0 to eNode.ChildNodes[k].ChildNodes.count-1 do
            begin
              mNode:=eNode.ChildNodes[k].ChildNodes[m];
              for n:=0 to mNode.ChildNodes.count-1 do
              begin
                if mNode.ChildNodes[n].NodeName='subsystem' then
                begin
                  for o:=0 to mNode.ChildNodes[n].ChildNodes.Count-1 do
                  begin
                    dNode:=mNode.ChildNodes[n].ChildNodes[o];
                    for p:=0 to dNode.ChildNodes.Count-1 do
                    begin
                      sNode:=dNode.ChildNodes[p];
                      if sNode.Attributes['areasigtype'] = '12' then
                      begin
                        if ((sNode.Attributes['signalcode'] = 'X') and (sNode.Attributes['replacetag'] = '')) then
                        begin

                        end;
                      end;
                    end;
                  end;
                end;
              end;
            end;
          end;
        end;
      end;
    end;
  end;
end;
nur als Beispiel, musst halt auf deine Bedürfnisse umbauen...

Gruß Ruben

Yheeky 16. Apr 2008 10:37

Re: XML Dateien auslesen
 
Okay, welche Unit muss ich denn für IXMLDocument und IXMLNode einbinden?

moonwhaler 16. Apr 2008 10:45

Re: XML Dateien auslesen
 
Ein kleiner Tipp von mir: Versuch es mal mit der OmniXML Komponente. Dies ist recht leichtgewichtig und einfach anzuwenden - zudem Syntaxkompatibel zur MSXML. Sind einige Beispiele dabei, die eigentlich selbsterklärend sind...

http://www.omnixml.com/

Centrii 16. Apr 2008 10:49

Re: XML Dateien auslesen
 
Zitat:

Zitat von Yheeky
Okay, welche Unit muss ich denn für IXMLDocument und IXMLNode einbinden?

Delphi-Quellcode:
uses XMLIntf, XMLDoc;
Gruß Ruben

angelika81 16. Apr 2008 11:36

Re: XML Dateien auslesen
 
@Centrii

Ich denke, man kann diese Abfrage auch mit XPATH formulieren, dann brauchst du doch nicht so viele verschachtelte Bedingungen zu formulieren...

Centrii 16. Apr 2008 12:09

Re: XML Dateien auslesen
 
Zitat:

Zitat von angelika81
@Centrii

Ich denke, man kann diese Abfrage auch mit XPATH formulieren, dann brauchst du doch nicht so viele verschachtelte Bedingungen zu formulieren...

mag sein, hab ich noch nicht ausprobiert, ich bin bis jetzt mit meiner Methode ganz gut gefahren :wink:

Yheeky 16. Apr 2008 12:27

Re: XML Dateien auslesen
 
Okay, danke für den Tipp mit IXMLDocument und Co.

Ich habe bei folgendem Code allerdings noch das Problem, dass ich nicht auf die einzelnen Attribute komme.

Delphi-Quellcode:
var xml : TXMLDocument;
begin
  xml:=TXMLDocument.Create(nil);
  xml.LoadFromFile(Edit1.Text);
  xml.Active:=True;

  ShowMessage(Xml.DocumentElement.ChildNodes['computer'].ChildNodes['computerdaten'].???);
Habe es schon über Attributes versucht, aber das klappt irgendwie nicht :-/
Kann mir jemand helfen?

Centrii 16. Apr 2008 12:54

Re: XML Dateien auslesen
 
Delphi-Quellcode:
var XML                      : IXMLDocument;
    CNode                    : IXMLNode;
    CdNode                   : IXMLNode;
    PNode                    : IXMLNode;
    i,j,k,m,n,o,p            : Integer;
begin
  XML:=NewXMLDocument;
  XML.XML.Text:=XMLCode;
  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='mainbord' then Variable := PNode.NodeValue;  // deine Variable
          else if PNode.NodeName='cpu' then Variable := PNode.NodeValue;  // deine Variable
           .
           .
           .
           .
        end;
      end;
    end;
  end;
end;
probier das mal, aber keine garantie, das habe ich eben nur hier rein geschrieben, ohne zu testen

Gruß Ruben

shmia 16. Apr 2008 13:02

Re: XML Dateien auslesen
 
Zitat:

Zitat von Yheeky
Habe es schon über Attributes versucht, aber das klappt irgendwie nicht :-/

Die XML Beispieldaten enthalten keine Attribute!
Das ist ein Element: <Computer>blabla</Computer>
In folgendem Element ist ein Attribut namens SerialNo enthalten: <Computer SerialNo="35345" />

Yheeky 16. Apr 2008 13:17

Re: XML Dateien auslesen
 
Ok, aber auch mit ChildNodes habe ich es nicht hinbekommen :-(

@Centrii: Bekomme nun eine Fehlermeldung:
Zitat:

Kein aktives Dokument.

Centrii 16. Apr 2008 13:22

Re: XML Dateien auslesen
 
hier musst du dein XML zuweisen.

Delphi-Quellcode:
XML.XML.Text:=XMLCode;
z.B.

Delphi-Quellcode:
XML.XML.Text := memo1.lines.text;

Yheeky 16. Apr 2008 13:36

Re: XML Dateien auslesen
 
Fehlermeldung bleibt leider bestehen.

Hier mal meine komplette Unit:

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, XMLIntf, XMLDoc;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

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;

end.
In Memo1 steht:

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>

Centrii 16. Apr 2008 13:42

Re: XML Dateien auslesen
 
es ist ein
Delphi-Quellcode:
var XML : IXMLDocument;
und dann mach kein

Delphi-Quellcode:
XML := TXMLDocument.Create(nil);
sondern ein

Delphi-Quellcode:
XML:=NewXMLDocument;
Gruß Ruben

Yheeky 16. Apr 2008 13:59

Re: XML Dateien auslesen
 
Okay, super, nun funktioniert [/delphi]das schonmal.

Mir fehlt´s nun nur noch an der Ausgabe. Ich habe bisher folgendes:
Delphi-Quellcode:
var i, j : integer;
begin
// Werte zählen
  for i := 0 to myFirstXML.DocumentElement.ChildNodes.Count - 1 do
   for j := 0 to myFirstXML.DocumentElement.ChildNodes['computerdaten'].ChildNodes.Count -1 do
// ...
Von dem Schleifendurchlauf (2 mal) funktioniert es schonmal, aber ich bekomme immer nur den ersten Satz von Computerteilen angezeigt :-/

Centrii 16. Apr 2008 14:08

Re: XML Dateien auslesen
 
du musst natürlich alle Childs durchlaufen, in deiner Unit hast du auch nur "MAinboard" abgefragt, deshalb bekommst du nur den ersten Satz, das gleich musst du jetzt für die anderen Childs auch machen.
Hab ich unter #9 schon angedeuted....

Yheeky 16. Apr 2008 14:22

Re: XML Dateien auslesen
 
Nee, also hier frage ich ja den kompletten Tag ab:

Delphi-Quellcode:
var i, j : integer;
begin
// Werte zählen
  for i := 0 to myFirstXML.DocumentElement.ChildNodes.Count - 1 do
   for j := 0 to myFirstXML.DocumentElement.ChildNodes['computerdaten'].ChildNodes.Count -1 do
// ...
Ich bekomme ja auch die Werte für Mainboard, CPU, Ram und Festplatte geliefert, doch beim ersten ist es ein ASUS Mainboard beim zweiten ein MSI...er zeigt mir aber bei beiden Durchläufen ASUS an.
Ich muss auch irgendwie i und j verwenden, aber ich hab´s noch zu keiner funktionierenden Lösung gebracht.

Du oder jemand anderes eine Idee?

Centrii 16. Apr 2008 14:25

Re: XML Dateien auslesen
 
mach aus deinem Progrämmchen ein .zip, dann kann man sich das mal anschauen....

Yheeky 16. Apr 2008 14:31

Re: XML Dateien auslesen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Okay, dank' dir.

Hab die exe mal mit reingepackt.

Yheeky 16. Apr 2008 14:59

Re: XML Dateien auslesen
 
Habs! War doch recht einfach:

Delphi-Quellcode:
ShowMessage(myFirstXML.DocumentElement.ChildNodes[i].ChildNodes[j].Text);
Danke trotzdem für die Mühe!

Centrii 16. Apr 2008 15:01

Re: XML Dateien auslesen
 
Liste der Anhänge anzeigen (Anzahl: 1)
von einem leeren Project war nicht die Rede ;-)

Im Anhang ein funktionierende Version

Yheeky 17. Apr 2008 13:38

Re: XML Dateien auslesen
 
Warum leer?! :-D


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