Thema: Delphi Werte aus XML auslesen

Einzelnen Beitrag anzeigen

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