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