AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Werte aus XML auslesen

Ein Thema von mmarkus260177 · begonnen am 8. Mär 2006 · letzter Beitrag vom 9. Mär 2006
Antwort Antwort
mmarkus260177

Registriert seit: 8. Mär 2006
2 Beiträge
 
#1

Werte aus XML auslesen

  Alt 8. Mär 2006, 11:07
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.

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']);
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#2

Re: Werte aus XML auslesen

  Alt 8. Mär 2006, 11:19
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
  Mit Zitat antworten Zitat
mmarkus260177

Registriert seit: 8. Mär 2006
2 Beiträge
 
#3

Re: Werte aus XML auslesen

  Alt 9. Mär 2006, 11:00
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
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#4

Re: Werte aus XML auslesen

  Alt 9. Mär 2006, 11:32
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
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:04 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