![]() |
Werte aus XML auslesen
Hallo zusammen,
Vielleicht kann mir jemand weiterhelfen. Ich benutze ein XML File anstatt eines INI Files um Werte zu speichern und auszulesen. Das funktioniert ansich auch schon. Aber gibt es beim auslesen keine effektivere Methode? In meinem Fall ist ja das noch ganz ok, aber was passiert wenn ich von 50 Konten das 102 Child Element auslesen will, wie es z.B. der Fall ist wenn man Datenbankstrukturen in XML Files speichert. :wall: :coder: :dp:
Delphi-Quellcode:
XMLDoc.Active := True;
showmessage(VarToStr(XMLDoc.DocumentElement.ChildNodes.Nodes['TerminalNr'].NodeValue)); showmessage(VarToStr(XMLDoc.DocumentElement.ChildNodes.Nodes['Artikel'].ChildValues['ArtikelProd1'])); Edit1.Text:=VarToStr(XMLDoc.DocumentElement.ChildNodes.Nodes['Artikel'].ChildValues['ArtikelProd1']); |
Re: Werte aus XML auslesen
Herzlich willkommen in der Delphi-PRAXiS.
XML ist kein Speicherformat für Datenbanken. XML ist eine Text-Auszeichnungssprache (markup language). Nimm XML um Daten zwischen verschiedenen Systemen oder Programmen auszutauschen. Wenn du magst, dann nimm es auch für deine INI-Datei - auch wenn das dort in der Regel keinen Sinn macht. Du verwendest momentan einen DOM-Parser und erzeugst damit ein vollständiges Abbild der XML-Datei im Hauptspeicher. Wenn du das nicht benötigst, dann musst du mit SAX arbeiten. Damit werden XML-Dateien im streaming mode verarbeitet und du reagierst nur auf Ereignisse. Freundliche Grüße vom marabu |
Re: Werte aus XML auslesen
Hallo,
danke für deine Antwort. Das mit dem INI File sollte nur ein Beispiel sein. Mir geht es aber um die Zugriffswege auf die Knoten. Es muss doch möglich sein direkt auf einen bestimmten Konten zu springen und dessen Wert bzw. bestimmte Werte in dieser Hirachie Ebene bzw. in Knoten die sich unterhalb befinden auszulesen. Ein Beispiel. Mit folgendem Code wird eine Angebotsdatenbank im XML Format gespeichert.
Delphi-Quellcode:
Dieses XML File wird über Internet transportiert und von einer anderen Anwendung von mir gelesen. Zum Beispiel will ich jetzt auch das Angebot Nr. 2 dessen Werte und die Positionen zugreifen.
procedure TForm1.btnXmlSpeichernClick(Sender: TObject);
var iNode, AngKopf, DatenFeld, AngPos : IXMLNode; i:integer; begin if FileExists(ChangeFileExt(ParamStr(0),'.XML')) then DeleteFile(ChangeFileExt(ParamStr(0),'.XML')); XMLDoc.Active := True; iNode := XMLDoc.AddChild('AngeboteAnZentrale'); iNode.Attributes['AngeboteKopf.Records'] := badKopf.RecordCount; with badKopf do begin DisableControls; First; while not Eof do begin AngKopf := XMLDoc.DocumentElement.AddChild('AngeboteKopf'); for i:=0 to Fields.Count-1 do begin DatenFeld := AngKopf.AddChild(Fields[i].FieldName); DatenFeld.Text:= Fields[i].AsString; end;//fields.count ErstelleXmlPositionen(AngKopf, FieldByName('akNr').AsString); Next; end;//not eof end;//with badKopf XMLDoc.SaveToFile(ChangeFileExt(ParamStr(0),'.XML')); end; //------------------------------------------------------------------------------ procedure TForm1.ErstelleXmlPositionen(aXmlNode: IXMLNode; aAngNr:String); var badAngPos:TBetterADODataSet; i:integer; AngPos, DatenFeld : IXMLNode; begin badAngPos:=TBetterADODataSet.Create(Self); with badAngPos do begin try Connection:=ADOConnection1; CommandText:='select * from AngebotePos where apNr='+aAngNr; Open; First; while not Eof do begin AngPos := aXmlNode.AddChild('AngebotePositionen'); for i:=0 to Fields.Count-1 do begin DatenFeld := AngPos.AddChild(Fields[i].FieldName); DatenFeld.Text:= Fields[i].AsString; end;//fields.count Next; end;//not eof finally Free; end;//try bad end;//with badAngPos end;
Delphi-Quellcode:
Das muss doch eleganter als mit folgendem Code funktionieren.
<AngeboteAnZentrale AngeboteKopf.Records="2">
<AngeboteKopf> <akNr>1</akNr> <akKundenNr>1000</akKundenNr> <akAngebotArt>A1</akAngebotArt> <akTermin>01.01.2006</akTermin> <AngebotePositionen> <apNr>1</apNr> <apArtikelNr>ART1000</apArtikelNr> <apArtikelBez>Bezeichnung Artikel 1000</apArtikelBez> <apMenge>1</apMenge> <apPreis>10,1000003814697</apPreis> <apRabatt>15</apRabatt> </AngebotePositionen> <AngebotePositionen> <apNr>1</apNr> <apArtikelNr>ART2000</apArtikelNr> <apArtikelBez>Bezeichnung Artikel 1000</apArtikelBez> <apMenge>2</apMenge> <apPreis>20,5400009155273</apPreis> <apRabatt>20</apRabatt> </AngebotePositionen> </AngeboteKopf> <AngeboteKopf> <akNr>2</akNr> <akKundenNr>1001</akKundenNr> <akAngebotArt>A2</akAngebotArt> <akTermin>01.02.2006</akTermin> <AngebotePositionen> <apNr>2</apNr> <apArtikelNr>ART1000</apArtikelNr> <apArtikelBez>Bezeichnung Artikel 1000</apArtikelBez> <apMenge>1</apMenge> <apPreis>10,1000003814697</apPreis> <apRabatt>15</apRabatt> </AngebotePositionen> <AngebotePositionen> <apNr>2</apNr> <apArtikelNr>ART3000</apArtikelNr> <apArtikelBez>Bezeichnung Artikel 3000</apArtikelBez> <apMenge>3</apMenge> <apPreis>30,8700008392334</apPreis> <apRabatt>30</apRabatt> </AngebotePositionen> </AngeboteKopf> </AngeboteAnZentrale>
Delphi-Quellcode:
lg Markus
showmessage(VarToStr(XMLDoc.DocumentElement.ChildNodes.Nodes['AngeboteKopf'].ChildValues['akNr']));
Edit1.Text:=VarToStr(XMLDoc.DocumentElement.ChildNodes.Nodes['AngeboteKopf'].ChildNodes.Nodes['AngebotePositionen'].ChildValues['apNr']); |
Re: Werte aus XML auslesen
Selbstverständlich - das Zauberwort heißt XPATH.
Delphi-Quellcode:
Grüße vom marabu
var
dn: IDOMNodeEx; begin with XMLDoc.DocumentElement.DOMNode as IDOMNodeSelect do begin xPath := './AngeboteKopf[akNr="2"]/akKundenNr'; dn := selectNode(xPath) as IDomNodeeX; if Assigned(dn) then ShowMessage(dn.Text); end; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:22 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