Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   XML (https://www.delphipraxis.net/46-xml/)
-   -   XML-Datei einlesen (https://www.delphipraxis.net/209427-xml-datei-einlesen.html)

Adenos 5. Dez 2021 13:53

XML-Datei einlesen
 
Hallo,

ich habe eine XML-Datei mit folgendem Inhalt:
<Cube>
<Cube time='2021-12-03'>
<Cube currency='USD' rate='1.1291'/>
<Cube currency='JPY' rate='127.97'/>
<Cube currency='BGN' rate='1.9558'/>
usw.
wie kann ich die "Cube time" in einem Label darstellen?

Aviator 5. Dez 2021 16:05

AW: XML-Datei einlesen
 
Schau dir mal das
Delphi-Quellcode:
IXmlDocument
Interface an. Damit kannst du deine XML Datei einlesen und dann über die Nodes iterieren. Beim Iterieren musst du dann nach dem
Delphi-Quellcode:
time
Attribut Ausschau halten das du einlesen willst.

Edit: Ich kenne zwar nicht den genauen Anwendungsfall, aber ich hab das Gefühl, dass der Aufbau der XML Datei etwas komisch ist. Ist das eine Vorgabe eines anderen Programms oder hast du die selbst gemacht?

Ein Aufbau in dieser Form wäre sicherlich besser einlesbar.

XML-Code:
<cube time='2021-12-03'>
    <currency name='USD' rate='1.1291'/>
    <currency name='JPY' rate='127.97'/>
    <currency name='BGN' rate='1.9558'/>
</cube>

Adenos 5. Dez 2021 16:22

AW: XML-Datei einlesen
 
das XML-Dokument ist nicht selbst gemacht. Auf der Seite http://www.ecb.europa.eu/stats/eurof...xref-daily.xml veröffentlicht die EZB einmal täglich die aktuellen Euro-Kurse. Beim Einlesen der eigentlichen Kurse hat mir schon jemand geholfen, aber das mit dem Datum bekomme ich nicht auf die Reihe.

zeras 5. Dez 2021 16:35

AW: XML-Datei einlesen
 
Für das Datum nimmst du StrToDate.
Dann hast du einen TDateTime Wert, den du dann beliebig anzeigen lassen kannst.
Bei den
Delphi-Quellcode:
AFormatSettings: TFormatSettings
musst du die Settings so eintragen, wie in deinem Beispiel angegeben.

Adenos 5. Dez 2021 16:41

AW: XML-Datei einlesen
 
vielen Dank, aber ich weiß nicht, wie ich auf das Feld cube time zugreifen kann.

Aviator 5. Dez 2021 16:55

AW: XML-Datei einlesen
 
Time ist ein Attribute des Nodes Cube. Wie liest du denn aktuell die Daten ein? Sicherlich nutzt du eine Klasse in der es ein Attribute Property gibt.

Adenos 5. Dez 2021 16:59

AW: XML-Datei einlesen
 
die Kurse lese ich so ein:
with Doc.DocumentElement.FindNode('Cube').FirstChild.Ch ildNodes do
begin
for i := 0 to (Count - 1) do
begin
Memo1.Lines.Add(Item[i].Attributes.GetNamedItem('currency').NodeValue +
':' + Item[i].Attributes.GetNamedItem('rate').NodeValue);
end;
end;

zeras 5. Dez 2021 17:04

AW: XML-Datei einlesen
 
Versuche es doch mal so:
Delphi-Quellcode:
Memo1.Lines.Add(Item[0].Attributes.GetNamedItem('time').NodeValue

Aviator 5. Dez 2021 17:09

AW: XML-Datei einlesen
 
Aber Achtung bei nicht vorhandenen Attributen. Ggf. sollte vorher mit
Delphi-Quellcode:
HasAttribute()
geprüft werden ob das Attribut überhaupt existiert. Oder anders herum ob die Rückgabe nicht
Delphi-Quellcode:
nil
ist.

Adenos 5. Dez 2021 17:38

AW: XML-Datei einlesen
 
das Programm hat eine Exception-Klasse "External: SIGSEGV" ausgelöst in der Zeile:
LabelEZBDatum.Caption:=Doc.DocumentElement.Attribu tes.GetNamedItem('Cube time').NodeValue;

zeras 5. Dez 2021 17:48

AW: XML-Datei einlesen
 
Warum fragst du die Zeit
Delphi-Quellcode:
 GetNamedItem('Cube time').NodeValue;


so ab, aber Currency mit

Delphi-Quellcode:
 GetNamedItem('currency').NodeValue

peterbelow 6. Dez 2021 16:03

AW: XML-Datei einlesen
 
Zitat:

Zitat von Adenos (Beitrag 1498689)
das XML-Dokument ist nicht selbst gemacht. Auf der Seite http://www.ecb.europa.eu/stats/eurof...xref-daily.xml veröffentlicht die EZB einmal täglich die aktuellen Euro-Kurse. Beim Einlesen der eigentlichen Kurse hat mir schon jemand geholfen, aber das mit dem Datum bekomme ich nicht auf die Reihe.

Wer immer dieses Format entwickelt hat sollte standrechtlich erschossen werden :).
Code:
   <Cube>
      <Cube time='2021-12-03'>
         <Cube currency='USD' rate='1.1291'/>
         <Cube currency='JPY' rate='127.97'/>
         <Cube currency='BGN' rate='1.9558'/>
         <Cube currency='CZK' rate='25.415'/>
         <Cube currency='DKK' rate='7.4362'/>
         <Cube currency='GBP' rate='0.85048'/>
      </Cube>
   </Cube>
Es gibt hier drei verschiedene Typen von "Cube"-Nodes, und damit kommt nicht mal der XML Data Binding Wizard von Delphi klar.

Das hier scheint zu funktionieren:

Delphi-Quellcode:
procedure TForm1.Display(const Fmt: string; const Values: array of const);
begin
  memo1.Lines.Add(Format(Fmt, Values));
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  LEnvelope: IXMLDocument;
  LOuterCube: IXMLNode;
  LTimeCube: IXMLNode;
  LCurrencyCube: IXMLNode;
begin
  LEnvelope := TXmlDocument.Create(nil);
  LEnvelope.LoadFromFile('C:\Users\Peter_2\Downloads\eurofxref-daily.xml');
  LEnvelope.Active := True;
  memo1.Clear;
  LOuterCube := LEnvelope.DocumentElement.ChildNodes[2];
  LTimeCube := LOuterCube.ChildNodes[0];

  Display('Date: %s', [LTimeCube.Attributes['time']]);
  LCurrencyCube := LTimeCube.ChildNodes[0];
  while Assigned(LCurrencyCube) do begin
    Display('Currency: %s; Rate: %s',
      [LCurrencyCube.Attributes['currency'],
       LCurrencyCube.Attributes['rate']] );
    LCurrencyCube := LCurrencyCube.NextSibling;
  end;
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:48 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 by Thomas Breitkreuz