![]() |
TidHTTP.Get um TXMLDocument zu füllen
Ich versuche was eigentlich ganz simples...dachte ich.
Ich möchte das XML, das hinter diesem Link steckt ![]()
Delphi-Quellcode:
Das XML wird definitv eingelesen, allerdings kommen immer wieder Fehler beim Parsen.
var
XMLDoc :TXMLDocument; IdHPP1 : TIdHTTP; . . . XMLDoc.XML.Text := IdHTTP1.Get(Trim(edURL.Text)); XMLDoc.Active := True; 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 |
Re: TidHTTP.Get um TXMLDocument zu füllen
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 :-(. |
Re: TidHTTP.Get um TXMLDocument zu füllen
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 |
Re: TidHTTP.Get um TXMLDocument zu füllen
Zitat:
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
Delphi-Quellcode:
UTF-8-Zeichen, also wird der Fehler korrekt angezeigt.
kein
Die genannte XML-Datei ( ![]() 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
Delphi-Quellcode:
aber besser kommst du, du downloadest die Datei in einen Stream,
XMLDoc.XML.Text := '<?xml version="1.0" encoding="ISO-8859-1"?>' + IdHTTP1.Get(Trim(edURL.Text));
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. |
Re: TidHTTP.Get um TXMLDocument zu füllen
Hallo,
Zitat:
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. |
Re: TidHTTP.Get um TXMLDocument zu füllen
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 :shock: 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? |
Re: TidHTTP.Get um TXMLDocument zu füllen
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. |
Re: TidHTTP.Get um TXMLDocument zu füllen
Zitat:
Und demnach ist die A0 ein ungültiges Zeichen. Darum auch meine Frage, Zitat:
lade mal bitte Berlin runter ![]() 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. |
Re: TidHTTP.Get um TXMLDocument zu füllen
OK, funktioniert, wenn ich noch vorher das
XML-Code:
aus dem Google entferne.
<?xml version="1.0"?>
Jetzt komm ich weiter, vielen Dank! :dp: Sherlock |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:25 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-2025 by Thomas Breitkreuz