XML Datei einlesen

Für Fragen von Einsteigern und Programmieranfängern...
hbr
Beiträge: 321
Registriert: Mi 20. Feb 2013, 10:30
OS, Lazarus, FPC: Win (L 2.2.4 FPC 3.2.2)
CPU-Target: 32/64,ARM(RPi)

XML Datei einlesen

Beitrag von hbr »

Hallo,
vieleicht kann mir jemand helfen?
Suche schon sehr lange und bisher vergebens.

Ich öffne mit ReadXMLFile(Doc, XMLDatei) eine XML Datei und alles ist gut.

Nun möchte ich aber eine XML-Datei aus dem Web 'http://undsoweiter/test.xml' laden was mir nicht gelingt.

Mit welchem Befehl (unit) kann ich das tun?

Gruß
hbr

Benutzeravatar
theo
Beiträge: 10881
Registriert: Mo 11. Sep 2006, 19:01

Re: XML Datei einlesen

Beitrag von theo »

Du kannst die Datei z.B. mit Synapse in einen MemoryStream laden (HttpGetBinary in unit httpsend) und dann an ReadXMLFile übergeben.

http://synapse.ararat.cz/

hbr
Beiträge: 321
Registriert: Mi 20. Feb 2013, 10:30
OS, Lazarus, FPC: Win (L 2.2.4 FPC 3.2.2)
CPU-Target: 32/64,ARM(RPi)

Re: XML Datei einlesen

Beitrag von hbr »

Danke,
theo hat geschrieben:Du kannst die Datei z.B. mit Synapse in einen MemoryStream laden (HttpGetBinary in unit httpsend) und dann an ReadXMLFile übergeben.

http://synapse.ararat.cz/
Gibt es keine Lazarus eigene Bordmittel um eine xml Datei im Web zu lesen?

Gruß

Benutzeravatar
theo
Beiträge: 10881
Registriert: Mo 11. Sep 2006, 19:01

Re: XML Datei einlesen

Beitrag von theo »

hbr hat geschrieben:Danke,
Gibt es keine Lazarus eigene Bordmittel um eine xml Datei im Web zu lesen?
Viel einfacher geht's nicht. Synapse ist quasi ein "Bordmittel". ;-)

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2817
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: XML Datei einlesen

Beitrag von m.fuchs »

hbr hat geschrieben:
theo hat geschrieben:[...]
http://synapse.ararat.cz/
Gibt es keine Lazarus eigene Bordmittel um eine xml Datei im Web zu lesen?
Wenn du wirklich das Herunterladen und Entpacken von Synapse scheust, dann kannst du auch den mitgelieferten TFPHttpClient benutzen. Hab ich noch nie mit gearbeitet, weil ich mit Synapse groß geworden bin und es sehr schätze. Aber funktionieren wird das wohl auch.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

hbr
Beiträge: 321
Registriert: Mi 20. Feb 2013, 10:30
OS, Lazarus, FPC: Win (L 2.2.4 FPC 3.2.2)
CPU-Target: 32/64,ARM(RPi)

Re: XML Datei einlesen

Beitrag von hbr »

OK,
habe versucht mir das zu installieren, was bei mir nicht geht.
Komme mit der Datei "laz_synapse.lpk" nicht weiter, die Units werden nicht gefunden.
Muß man die in ein bestimtes Verzeichnis von Lazerus Kopieren?

Gruß

Benutzeravatar
theo
Beiträge: 10881
Registriert: Mo 11. Sep 2006, 19:01

Re: XML Datei einlesen

Beitrag von theo »

hbr hat geschrieben: Muß man die in ein bestimtes Verzeichnis von Lazerus Kopieren?
Nein, es sind auch keine visuellen Komponenten.
Du musst aber natürlich die Abhängigkeit von dem Package ins Projekt aufnehmen.
Projekt - > Projektinspektor -> Hinzufügen -> Neue Anforderung -> laz_synapse
Danach werden die Units in deinem Projekt gefunden.

Zuerst mal noch das lpk einmal öffnen und kompilieren im Package Menu.

hbr
Beiträge: 321
Registriert: Mi 20. Feb 2013, 10:30
OS, Lazarus, FPC: Win (L 2.2.4 FPC 3.2.2)
CPU-Target: 32/64,ARM(RPi)

Re: XML Datei einlesen

Beitrag von hbr »

Danke für eure Hilfe,
doch komme ich keinen Schritt weiter.
Weder mit ' httpsend ' noch mit ' TFPHttpClient '.

Zu ' httpsend '
Bei 'httpsend.HttpGetBinary(BaseURL, XmlInhalt);' kommt eine Fehlermeldung in der Unit ' httpsend '
Response.Seek(0, soFromBeginning);

Irgend wie finde ich zu beiden Units zu wenig Infos die mir weiterhelfen würde.

Gibt es vieleicht noch eine ander Idee?

Zu den Package:
Die Procedure
Projekt - > Projektinspektor -> Hinzufügen -> Neue Anforderung -> laz_synapse
mus bei jedem Projekt gemacht werden damit die Units erkannt werden. Ist das Normal ?
Bei Delphi wurden die nur einmal hinzugefügt.

Gruß

Benutzeravatar
theo
Beiträge: 10881
Registriert: Mo 11. Sep 2006, 19:01

Re: XML Datei einlesen

Beitrag von theo »

hbr hat geschrieben: Zu ' httpsend '
Bei 'httpsend.HttpGetBinary(BaseURL, XmlInhalt);' kommt eine Fehlermeldung in der Unit ' httpsend '
Und wie lautet die? Und was ist XmlInhalt für ein Datentyp?
Sei bitte ausführlich, sonst kann man dir nicht helfen.
hbr hat geschrieben: Zu den Package:
Die Procedure
Projekt - > Projektinspektor -> Hinzufügen -> Neue Anforderung -> laz_synapse
mus bei jedem Projekt gemacht werden damit die Units erkannt werden. Ist das Normal ?
Bei Delphi wurden die nur einmal hinzugefügt.
Das ist was anderes als die Pfade bei Delphi.
Ja, das ist normal. Bei visuellen Komponenten geschieht das automatisch, bei nicht-visuellen manuell.

hbr
Beiträge: 321
Registriert: Mi 20. Feb 2013, 10:30
OS, Lazarus, FPC: Win (L 2.2.4 FPC 3.2.2)
CPU-Target: 32/64,ARM(RPi)

Re: XML Datei einlesen

Beitrag von hbr »

OK, Danke

Ich habe nun meinen Inhalt erst einmal in einem Memo.
Nun soll der XmlInhalt : TMemoryStream; wie Du sagtest an ReadXMLFile( Doc, ???URL) übergeben werden.
Aber wie?
Ich werte meine XML mit 'with Doc.DocumentElement.ChildNodes do Begin ..... aus.
Wie bekomme ich nun den Inhalt von TMemoryStream nach Doc.DocumentElement ????

Hier die übergabe ins Memo.

Code: Alles auswählen

 
try
      XmlInhalt := TMemoryStream.Create;
      httpsend.HttpGetBinary(BaseURL,XmlInhalt)  ;
      XmlInhalt.Seek(0,soFromBeginning);
      Memo1.Lines.LoadFromStream(XmlInhalt);
      ReadXMLFile(Documento,XmlInhalt);
finally
      XmlInhalt.Free;
end;  
Gruß
Zuletzt geändert von Lori am Mi 20. Feb 2013, 20:20, insgesamt 1-mal geändert.
Grund: richtiger Highlighter

Benutzeravatar
theo
Beiträge: 10881
Registriert: Mo 11. Sep 2006, 19:01

Re: XML Datei einlesen

Beitrag von theo »

Ich verstehe deine Frage nicht. Sei bitte etwas präziser.
Du lädst den Stream ja nach "Documento", nennst es in der Beschreibung aber wieder "Doc".
Wenn du so ungenau bist, versteht man dich nicht.

hbr
Beiträge: 321
Registriert: Mi 20. Feb 2013, 10:30
OS, Lazarus, FPC: Win (L 2.2.4 FPC 3.2.2)
CPU-Target: 32/64,ARM(RPi)

Re: XML Datei einlesen

Beitrag von hbr »

Sorry,
der letzte Eintrag "ReadXMLFile(Documento,XmlInhalt);" war ein Versuch und funktioniert nicht.

Bei dem zweiten Wert von ReadXMLFile wird Type "String" Erwartet, also der Dateiname auf dem Lokalen Rechner.
XMLInhalt ist vom Type TMemoryStream

Meine Frage:!
Wie bekomme ich XMLInhalt(welches z.Z. in Memo ist > nach Documento(= Doc)) vom Typ TXMLDocument ?

Augewertet mird so!

Code: Alles auswählen

var
   Documento: TXMLDocument;
   i, j: Integer;
 begin
   ReadXMLFile(Documento, 'C:\Programas\teste.xml');
   Memo.Lines.Clear;
   with Documento.DocumentElement.ChildNodes do
   begin
     for i := 0 to (Count - 1) do
     begin
       Memo.Lines.Add(Item[i].NodeName + ' ' + Item[i].Attributes.Item[0].NodeValue);
       for j := 0 to (Item[i].ChildNodes.Count - 1) do
       begin
         Memo.Lines.Add(Item[i].ChildNodes.Item[j].NodeName + ' '
          + Item[i].ChildNodes.Item[j].FirstChild.NodeValue);
       end;
     end;
   end;
   Documento.Free;
 end;
Ist das so Verständlich, oder fehlt eine Info?

Es geht ja darum, wie oben erwähnt die XML-Datei aus dem Netz zu laden und auszuwerten.

Gruß
Zuletzt geändert von Lori am Do 21. Feb 2013, 16:01, insgesamt 1-mal geändert.
Grund: richtiger Highlighter

Benutzeravatar
theo
Beiträge: 10881
Registriert: Mo 11. Sep 2006, 19:01

Re: XML Datei einlesen

Beitrag von theo »

hbr hat geschrieben:Sorry,
der letzte Eintrag "ReadXMLFile(Documento,XmlInhalt);" war ein Versuch und funktioniert nicht.

Bei dem zweiten Wert von ReadXMLFile wird Type "String" Erwartet, also der Dateiname auf dem Lokalen Rechner.
XMLInhalt ist vom Type TMemoryStream

Ist das so Verständlich, oder fehlt eine Info?
Ich weiss nicht, was du machst, damit das nicht funktioniert.
ReadXMLFile ist überladen und es gibt Varianten mit versch. Parametern.

Diese Variante nimmt doch einen TMemoryStream entgegen:

Code: Alles auswählen

 
procedure ReadXMLFile(out ADoc: TXMLDocument; f: TStream); overload;  
Das muss doch klappen.

hbr
Beiträge: 321
Registriert: Mi 20. Feb 2013, 10:30
OS, Lazarus, FPC: Win (L 2.2.4 FPC 3.2.2)
CPU-Target: 32/64,ARM(RPi)

Re: XML Datei einlesen

Beitrag von hbr »

Hallo Theo,

Danke ja,
wenn ich die Zeile Memo1. entferne läuft es.

Ansonsten gibt es eine Fehlermeldung!
Pojekt hat Exception-Klasse >>EXMLReadError<< ausgelöst mit der Meldung:
In 'stream:'(line1 pos 1): Root element is missing.
Bei Adresse 54CCED

Also Memo oder ReadXMLFile() aber nicht beide.

Wüste natürlich gerne woran das nun liegt!

Gruß

Benutzeravatar
theo
Beiträge: 10881
Registriert: Mo 11. Sep 2006, 19:01

Re: XML Datei einlesen

Beitrag von theo »

Wahrsch. musst du jew. vorher den Stream zurücksetzen. Das hast du ja schon mal gemacht:

XmlInhalt.Seek(0,soFromBeginning);

oder

XmlInhalt.Position:=0;

Antworten