Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   XML (https://www.delphipraxis.net/46-xml/)
-   -   Delphi Probleme beim Laden mit OmniXML (https://www.delphipraxis.net/91985-probleme-beim-laden-mit-omnixml.html)

CalganX 12. Mai 2007 22:00


Probleme beim Laden mit OmniXML
 
Hi,
ich habe im Moment arge Probleme mit dem Laden einer XML-Datei mit OmniXML. Ich lade mit meinem Code, den ich hier gepostet habe, die XML-Datei aus dem Internet herunter. Dazu sollte man sagen, dass die Datei im UTF-8-Format (also Unicode) abgespeichert ist und auch den entsprechenden Header hat.
Wenn die Daten angekommen sind, scheinen die auch richtig zu sein. Der Debugger sagt mir zumindest:
Code:
'<?xml version="1.0" encoding="UTF-8"?>'#$A'<cxupdate>'#$A#9'<project id="wpchanger" name="WallpaperChanger" page="http://blog.calganx.net/software/wpchanger/">'#$A#9#9'<version id="1.7.1" date="2006-08-13">'#$A#9#9#9'<changelog><![CDATA['#$A#9#9#9'Not available yet'#$A#9#9#9']]></changelog>'#$A#9#9'</version>'#$A#9#9'<version id="1.8" date="2007-05-06">'#$A#9#9#9'<changelog><![CDATA['#$A#9#9#9'<h1>WallpaperChanger V1.8</h1>'#$A'<ul>'#$A'[*][b]Fix:[/b] Problem mit Minimieren des Fensters behoben (Ticket #1)'#$A'[*][b]Feature:[/b] [i]CXUpdate[/i]-Anbindung.'#$A'[/list]'#$A#9#9#9']]></changelog>'#$A#9#9#9'<downloads>'#$A#9#9#9#9'<download id="0" downloadable="1" type="zip">http://blog.calganx.net/download/1</download>'#$A#9#9#9#9'<download id="1" downloadable="1" type="setup">http://blog.calganx.net/download/2</download>'#$A#9#9#9'</downloads>'#$A#9#9'</version>'#$A#9'</project>'#$A#9'<project id="infotunes" name="infoTunes" page="">'#$A#9'</project>'#$A#9'<project id="cxupdate" name="CXUpdate-Demo" page="http://trac.calganx.net/milestone/cxupdate.v01">'#$A#9#9'<version id="0.0" date="2007-05-01">'#$A#9#9#9'<changelog><![CDATA['#$A#9#9#9'Initial release'#$A#9#9#9']]></changelog>'#$A#9#9#9'<downloads>'#$A#9#9#9#9'<download id="0" downloadable="0">http://trac.calganx.net/browser/cxupdate/client/delphi/trunk</download>'#$A#9#9#9'</downloads>'#$A#9
#9'</version>'#$A#9#9'<version id="0.1" date="2007-05-12">'#$A#9#9#9'<changelog><![CDATA['#$A#9#9#9'2nd Beta release'#$A#9#9#9']]></changelog>'#$A#9#9'</version>'#$A#9#9'<version id="1.0" date="2007-08-13">'#$A#9#9#9'<changelog><![CDATA['#$A#9#9#9'Final release'#$A#9#9#9']]></changelog>'#$A#9#9'</version>'#$A#9'</project>'#$A'</cxupdate>'#$A#$10'Ú'#$12
Mein Code zum Laden der Datei in die OmniXML-Klasse sieht so aus:
Delphi-Quellcode:
var
  XmlString: WideString;
{...}
  // Stream mit XML-Daten erzeugen
  if (not Assigned(fXmlStream)) then
    fXmlStream := TMemoryStream.Create;
  XmlString := GetXMLString; // GetXMLString lädt die Datei aus dem Internet (siehe Link oben)
  fXmlStream.Write(XmlString, length(XmlString));

  // Datei aus Internet laden
  if (not fXmlParser.LoadFromStream(fXmlStream)) then
  begin
    raise EInOutError.Create('Datei konnte nicht geladen werden.');
    Exit;
  end;
Beim Laden erhalte ich nun konsequent eine Exception vom OmniXML (OmniXML.pas, Zeile 2769):
Zitat:

Erste Gelegenheit für Exception bei $7C812A5B. Exception-Klasse EXMLException mit Meldung 'A name contained an invalid character.'. Prozess CXUpdateDemo.exe (3640)
Scheinbar handelt es sich dabei um ein #0-Zeichen direkt am Anfang des Tags (zwischen < und dem Tagnamen).

Nun steht in den Supportforum, dass es Probleme beim Laden gibt, wenn das Encoding-Attribut angegeben wird. Ich habe jetzt den ganzen Block mit <?xml ... ?> herausgenommen, habe nur das Encoding herausgenommen, habe das Encoding verändert, ...
Nichts hilft. Er kann einfach nichts laden.

Hat jemand eine Idee, woran das liegen könnte? Es treibt mich langsam wirklich zur Weißglut.

Chris

Muetze1 13. Mai 2007 19:35

Re: Probleme beim Laden mit OmniXML
 
Ja, ich habe eine. Es klingt ganz nach einer UTF-16 kodierten Datei (also 2 Byte pro Zeichen). Nun weiss ich aber nicht, ob OmniXML MultiByte tauglich ist.

marabu 14. Mai 2007 09:34

Re: Probleme beim Laden mit OmniXML
 
Hallo Chris,

deine Funktion GetXMLString() könnte einer der Übeltäter sein. Du speicherst in dieser Funktion einen UTF-8 Datenstrom in einem WideChar-Buffer. OmniXML kann mit UTF-16 und UTF-8 umgehen, aber du solltest den Inhalt von XMLString mal im Debugger überprüfen. Es würde mich nicht wundern, wenn dort UTF-8 kodierte Zeichen drin stünden.

Freundliche Grüße

CalganX 14. Mai 2007 16:06

Re: Probleme beim Laden mit OmniXML
 
Hi,
der XMLString-String, den mir der Debugger gibt, steht oben im Eingangspost. Speichere ich den String allerdings in einer Datei oder in einem FileStream, so ist das Ergebnis nur kryptisch. Nach einigen herum probieren, habe ich festgestellt, dass die Funktion tatsächlich nicht das tut, was sie soll. Ich bin jetzt vorübergehend auf eine externe Bibliothek umgestiegen, die auf die gleichen API-Calls zugreift, mit der es funktioniert.

Es war also kein Fehler von OmniXML, sondern von GetXmlString.

Chris


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:03 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