Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   XML (https://www.delphipraxis.net/46-xml/)
-   -   Delphi Werte aus XML auslesen (https://www.delphipraxis.net/64790-werte-aus-xml-auslesen.html)

mmarkus260177 8. Mär 2006 10:07


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']);

marabu 8. Mär 2006 10:19

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

mmarkus260177 9. Mär 2006 10:00

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:
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;
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.

Delphi-Quellcode:
<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>
Das muss doch eleganter als mit folgendem Code funktionieren.

Delphi-Quellcode:
 showmessage(VarToStr(XMLDoc.DocumentElement.ChildNodes.Nodes['AngeboteKopf'].ChildValues['akNr']));
Edit1.Text:=VarToStr(XMLDoc.DocumentElement.ChildNodes.Nodes['AngeboteKopf'].ChildNodes.Nodes['AngebotePositionen'].ChildValues['apNr']);
lg Markus

marabu 9. Mär 2006 10:32

Re: Werte aus XML auslesen
 
Selbstverständlich - das Zauberwort heißt XPATH.

Delphi-Quellcode:
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;
Grüße vom marabu


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