AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi TidHTTP.Get um TXMLDocument zu füllen

TidHTTP.Get um TXMLDocument zu füllen

Ein Thema von Sherlock · begonnen am 13. Jan 2010 · letzter Beitrag vom 14. Jan 2010
Antwort Antwort
Benutzerbild von Sherlock
Sherlock

Registriert seit: 10. Jan 2006
Ort: Offenbach
3.557 Beiträge
 
Delphi 10.4 Sydney
 
#1

TidHTTP.Get um TXMLDocument zu füllen

  Alt 13. Jan 2010, 16:35
Ich versuche was eigentlich ganz simples...dachte ich.
Ich möchte das XML, das hinter diesem Link steckt http://www.google.com/ig/api?weather...+Germany&hl=de auslesen und dann parsen. Dazu habe ich mittlerweile drei verschiedene GETs ausprobiert, die alle das gleiche Problem liefern, leider habe ich nicht so viele XMLDocument-Typen zur Auswahl. Was ist das Problem?
Delphi-Quellcode:
var
XMLDoc :TXMLDocument;
IdHPP1 : TIdHTTP;
.
.
.
  XMLDoc.XML.Text := IdHTTP1.Get(Trim(edURL.Text));
  XMLDoc.Active := True;
Das XML wird definitv eingelesen, allerdings kommen immer wieder Fehler beim Parsen.
Und zwar EDOMParseError (An invalid character was found in text content).

Zwischenzeitlich bin ich etwas tiefer ins XML gekommen da kam der EConvertError (den bekomme ich allerdings nicht mehr seit ich mit dem Indy versuche einzulesen) und zwar zum Beispiel bei Umlauten oder auch beim Prozentzeichen der Luftfeuchtigkeit.

Encoding ist UTF-8.

Weiss jemand Rat?

Edit: Ich habe auch probiert über Streams zu gehen (XMLDoc.XML.LoadFromStream), das liefert die gleichen Probleme.

Sherlock
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#2

Re: TidHTTP.Get um TXMLDocument zu füllen

  Alt 13. Jan 2010, 17:06
Hallo,

das Einzige, was mir aufgefallen ist:

Das Leerzeichen vor dem Prozent ist kein "gewöhnliches" Blank (Hex 20) sondern "irgendwas" Anderes (Hex A0).
Liegt da eventuell ein Problem. Der IE kann die XML-Seite problemlos einlesen, so dass ich mal von einem korrekten XML ausgehe.

Schreib' doch die mit get geholte Seite erstmal ins Dateisystem und lass' sie Dir vom IE anzeigen (oder einem anderen Tool zum Anzeigen von XML - XMLSpy oder...)

Umlaute... kommen in der Seite ja nicht vor, so dass der Fehler für mich momentan nicht nachvollziehbar ist.
Muss irgendein "exotisches" Problem sein .
  Mit Zitat antworten Zitat
Benutzerbild von Sherlock
Sherlock

Registriert seit: 10. Jan 2006
Ort: Offenbach
3.557 Beiträge
 
Delphi 10.4 Sydney
 
#3

Re: TidHTTP.Get um TXMLDocument zu füllen

  Alt 13. Jan 2010, 17:21
Ah, das Leerzeichen, das ist ein guter Hinweis. Umlaute...nunja, je nach WEtterlage kanns auch mal "Bewölkt" sein.

Ich probier das mit dem Speichern morgen früh direkt mal aus. Vielen Dank für den Tipp. Schönen Feierabend.

Sherlock
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
38.949 Beiträge
 
Delphi 10.4 Sydney
 
#4

Re: TidHTTP.Get um TXMLDocument zu füllen

  Alt 13. Jan 2010, 17:34
Zitat von nahpets:
Der IE kann die XML-Seite problemlos einlesen, so dass ich mal von einem korrekten XML ausgehe.
Der IE ist kein XML Parser.
Da viele HTML-Seiten total mit Fehlern gefüllt sind, arbeiten HTML-Parser fehlerresistent und versuchen vieles "irgendwie" dennoch auszuwerten und anzuzeigen.

XML-Parser arbeiten da strickter ... was eigentlich nicht schlimm ist, da XML "streng" geregelte Regeln/Spezifikationen besitzt.

$A0 ist kein UTF-8-Zeichen, also wird der Fehler korrekt angezeigt.


Die genannte XML-Datei ( http://www.google.com/ig/api?weather...+Germany&hl=de ) besitzt keinen XML-Header und ohne sollte es laut XML-Spec UTF-8 sein, aber hier sieht es mehr nach ANSI aus.

Lösung: entweder nach UTF-8 konvertieren, bevor du es an TXMLDocument übergibst
oder du setzt einen XML-Header (XMLInstructionNode) davor, welcher was von ANSI sagt.



PS: Geh über den Stream, denn sonst bekommst du ab D2009 Probleme.
aktuell (bis D2007) könnte man es so versuchen
XMLDoc.XML.Text := '<?xml version="1.0" encoding="ISO-8859-1"?>' + IdHTTP1.Get(Trim(edURL.Text)); aber besser kommst du, du downloadest die Datei in einen Stream,
fügst vor den Dateidaten das '<?xml version="1.0" encoding="ISO-8859-1"?>' ein (natürlich als ANSI)
und nutzt dann LoadFromStream.

PSS: genau wegen sowas kann man bei himXML auch einen "Default"-Kodierung angeben ... also wenn die "angegebene" Kodierung nicht mit der tatsächlichen Kodierung übereinstimmt.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#5

Re: TidHTTP.Get um TXMLDocument zu füllen

  Alt 13. Jan 2010, 17:53
Hallo,
Zitat von himitsu:
Zitat von nahpets:
Der IE kann die XML-Seite problemlos einlesen, so dass ich mal von einem korrekten XML ausgehe.
Der IE ist kein XML Parser.
Da viele HTML-Seiten total mit Fehlern gefüllt sind, arbeiten HTML-Parser fehlerresistent und versuchen vieles "irgendwie" dennoch auszuwerten und anzuzeigen.

XML-Parser arbeiten da strickter ... was eigentlich nicht schlimm ist, da XML "streng" geregelte Regeln/Spezifikationen besitzt.

$A0 ist kein UTF-8-Zeichen, also wird der Fehler korrekt angezeigt.


Die genannte XML-Datei ( http://www.google.com/ig/api?weather...+Germany&hl=de ) besitzt keinen XML-Header und ohne sollte es laut XML-Spec UTF-8 sein, aber hier sieht es mehr nach ANSI aus.

Lösung: entweder nach UTF-8 konvertieren, bevor du es an TXMLDocument übergibst
oder du setzt einen XML-Header (XMLInstructionNode) davor, welcher was von ANSI sagt.



PS: Geh über den Stream, denn sonst bekommst du ab D2009 Probleme.
aktuell (bis D2007) könnte man es so versuchen
XMLDoc.XML.Text := '<?xml version="1.0" encoding="ISO-8859-1"?>' + IdHTTP1.Get(Trim(edURL.Text)); aber besser kommst du, du downloadest die Datei in einen Stream,
fügst vor den Dateidaten das '<?xml version="1.0" encoding="ISO-8859-1"?>' ein (natürlich als ANSI)
und nutzt dann LoadFromStream.

PSS: genau wegen sowas kann man bei himXML auch einen "Default"-Kodierung angeben ... also wenn die "angegebene" Kodierung nicht mit der tatsächlichen Kodierung übereinstimmt.
Stimmt, der IE selbst ist kein Parser, er benutzt den von Microsoft.
Bisher hat er mir noch keine XML-Datei angezeigt, die einen Fehler enthielt. Bei XML geht er anders vor als bei HTML, bei HTML darf geschludert werden, bei XML nicht.

Die Datei von Google enthält am Anfang die 3 typischen Bytes für UTF-8-Dateien, auch wenn es nicht nochmal explizit woanders steht. Das mag auch ein Problem sein. Ultraedit erkennt die Datei jedenfalls als UTF-8, zumindest dann, wenn man beim IE sagt: "Quelltext anzeigen". Will' nicht ausschließen, dass es erst dann UTF-8 wird.

Nagut: Wenn man die Datei per Indy holt, ist es ganz eindeutig kein UTF-8, aber die Hex A0 vor dem Prozentzeichen bleibt.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
38.949 Beiträge
 
Delphi 10.4 Sydney
 
#6

Re: TidHTTP.Get um TXMLDocument zu füllen

  Alt 13. Jan 2010, 18:03
Ahhrg, hatte mir die Datei jetzt nur mal kurz im FF angesehn.
- in der Anzeige fehlt <?xml ...?> und ein BOM wird dort natürlich auch nicht angezeigt
- und bei "Quelltext anzeigen" bekommt man eine veränderte Datei zu sehn
- nach "Datei speichern unter" bekommt man eine Datei mit einem nochmal ganz anderem Inhalt

OK, laut Spec ist ein BOM erlaubt,
aber es bleibt dabei A0 gehört nicht in UTF8 rein.

Habt ihr mal mitbekommen, wie/ob dort Umlaute kodiert sind?
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#7

Re: TidHTTP.Get um TXMLDocument zu füllen

  Alt 13. Jan 2010, 18:08
Hallo,

wenn ich die Datei direkt mit Indy hole (ohne irgendeinen Browser...) bekomme ich kein UTF-8 sondern ANSI (1 Byte pro Zeichen). Die A0 ist da aber auch drin enthalten.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
38.949 Beiträge
 
Delphi 10.4 Sydney
 
#8

Re: TidHTTP.Get um TXMLDocument zu füllen

  Alt 13. Jan 2010, 18:14
Zitat von nahpets:
wenn ich die Datei direkt mit Indy hole (ohne irgendeinen Browser...) bekomme ich kein UTF-8 sondern ANSI (1 Byte pro Zeichen). Die A0 ist da aber auch drin enthalten.
Wenn eine Datei kein BOM und auch keine Kodierung ( <?xml encoding="..." ?> ) enthält, dann wird es standardmäßig als UTF-8 angesehn ... so schreiben es die XML-Spezifikationen vor.

Und demnach ist die A0 ein ungültiges Zeichen.

Darum auch meine Frage,
Zitat:
Habt ihr mal mitbekommen, wie/ob dort Umlaute kodiert sind?
denn so wie es aussieht, könnte es ein Implementierungsfehler seitens Google sein.
lade mal bitte Berlin runter http://www.google.de/ig/api?weather=Berlin - dort ist grad ein ö drinnen

ps: himXML kann ungültige Zeichen "ignorieren" (xoChangeInvalidChars ist standardmäßig sogar schon gesetzt und wandelt alles Ungültige in ein Leerzeichen um)

Wie gesagt, wenn kein BOM und kein <?xml ?> enthalten ist, dann setze einfach ein entsprechendes <?xml ...?> für einen ANSI-Kodierung davor.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014
  Mit Zitat antworten Zitat
Benutzerbild von Sherlock
Sherlock

Registriert seit: 10. Jan 2006
Ort: Offenbach
3.557 Beiträge
 
Delphi 10.4 Sydney
 
#9

Re: TidHTTP.Get um TXMLDocument zu füllen

  Alt 14. Jan 2010, 10:47
OK, funktioniert, wenn ich noch vorher das
 <?xml version="1.0"?> aus dem Google entferne.
Jetzt komm ich weiter, vielen Dank!



Sherlock
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 15:46 Uhr.
Powered by vBulletin® Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf