![]() |
XML Dateien auslesen
Hi,
ich habe eine Memo mit folgendem (gekürzten) XML-Code:
XML-Code:
Wie kann ich z.B. über die Komponente JVSimpleXML diese Daten in eine ListView mit 3 Columns (Index, Key und Value) auslesen?
<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> 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! |
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:
nur als Beispiel, musst halt auf deine Bedürfnisse umbauen...
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; Gruß Ruben |
Re: XML Dateien auslesen
Okay, welche Unit muss ich denn für IXMLDocument und IXMLNode einbinden?
|
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...
![]() |
Re: XML Dateien auslesen
Zitat:
Delphi-Quellcode:
Gruß Ruben
uses XMLIntf, XMLDoc;
|
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... |
Re: XML Dateien auslesen
Zitat:
|
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:
Habe es schon über Attributes versucht, aber das klappt irgendwie nicht :-/
var xml : TXMLDocument;
begin xml:=TXMLDocument.Create(nil); xml.LoadFromFile(Edit1.Text); xml.Active:=True; ShowMessage(Xml.DocumentElement.ChildNodes['computer'].ChildNodes['computerdaten'].???); Kann mir jemand helfen? |
Re: XML Dateien auslesen
Delphi-Quellcode:
probier das mal, aber keine garantie, das habe ich eben nur hier rein geschrieben, ohne zu testen
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; Gruß Ruben |
Re: XML Dateien auslesen
Zitat:
Das ist ein Element: <Computer>blabla</Computer> In folgendem Element ist ein Attribut namens SerialNo enthalten: <Computer SerialNo="35345" /> |
Re: XML Dateien auslesen
Ok, aber auch mit ChildNodes habe ich es nicht hinbekommen :-(
@Centrii: Bekomme nun eine Fehlermeldung: Zitat:
|
Re: XML Dateien auslesen
hier musst du dein XML zuweisen.
Delphi-Quellcode:
z.B.
XML.XML.Text:=XMLCode;
Delphi-Quellcode:
XML.XML.Text := memo1.lines.text;
|
Re: XML Dateien auslesen
Fehlermeldung bleibt leider bestehen.
Hier mal meine komplette Unit:
Delphi-Quellcode:
In Memo1 steht:
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.
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> |
Re: XML Dateien auslesen
es ist ein
Delphi-Quellcode:
und dann mach kein
var XML : IXMLDocument;
Delphi-Quellcode:
sondern ein
XML := TXMLDocument.Create(nil);
Delphi-Quellcode:
Gruß Ruben
XML:=NewXMLDocument;
|
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:
Von dem Schleifendurchlauf (2 mal) funktioniert es schonmal, aber ich bekomme immer nur den ersten Satz von Computerteilen angezeigt :-/
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 // ... |
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.... |
Re: XML Dateien auslesen
Nee, also hier frage ich ja den kompletten Tag ab:
Delphi-Quellcode:
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.
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 muss auch irgendwie i und j verwenden, aber ich hab´s noch zu keiner funktionierenden Lösung gebracht. Du oder jemand anderes eine Idee? |
Re: XML Dateien auslesen
mach aus deinem Progrämmchen ein .zip, dann kann man sich das mal anschauen....
|
Re: XML Dateien auslesen
Liste der Anhänge anzeigen (Anzahl: 1)
Okay, dank' dir.
Hab die exe mal mit reingepackt. |
Re: XML Dateien auslesen
Habs! War doch recht einfach:
Delphi-Quellcode:
Danke trotzdem für die Mühe!
ShowMessage(myFirstXML.DocumentElement.ChildNodes[i].ChildNodes[j].Text);
|
Re: XML Dateien auslesen
Liste der Anhänge anzeigen (Anzahl: 1)
von einem leeren Project war nicht die Rede ;-)
Im Anhang ein funktionierende Version |
Re: XML Dateien auslesen
Warum leer?! :-D
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:39 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz