![]() |
VerySimpleXML: Problem unter iOS?
Hallo!
Ich teste gerade einen Cross-Platform XML Parser namens ![]()
Code:
nach dem Einlesen so was wird:
<?xml version="1.0" encoding="UTF-8"?>
<doc> <A>element A</A> <B>element B</B> <C>element C</C> <X>element X</X> <Y>element Y</Y> <Z>element Z</Z> </doc>
Code:
Kann mir jemand Helfen die Problemstelle zu finden?
<?xml version="1.0" ?>
<A>element A </A> <B>element B </B> <C>element C </C> <X>element X </X> <Y>element Y </Y> <Z>element Z </Z /> </Z> <//Y> </Y> <//X> </X> <//C> </C> <//B> </B> <//A> </A> Im Voraus vielen Dank! |
AW: VerySimpleXML: Problem unter iOS?
Das sieht ja lustig aus. Ich schaue es mir mal an und werde dann den Programmierer schlagen (aua aua), wenn da was nicht stimmt.
P.S.: Wie kommst Du darauf, dass der Cross-Plattform ist? |
AW: VerySimpleXML: Problem unter iOS?
Zitat:
|
AW: VerySimpleXML: Problem unter iOS?
Zitat:
Anders wäre es wenn er z.B. mit dem MSXML-Parser eine Komponente verwenden würde die es nur unter Windows gibt. Ich tipp mal darauf das er im Bereich Plattformunabhängigen Zeilenumbruch beim Beatifiere einen Fehler macht. |
AW: VerySimpleXML: Problem unter iOS?
Wäre sehr danbar, wenn Sie mir bei der Fehlersuche helfen würden. Danke!
|
AW: VerySimpleXML: Problem unter iOS?
Wie erhältst Du die Ausgabe? Bitte mal Demo Source posten.
|
AW: VerySimpleXML: Problem unter iOS?
Ich glaub fast der TStreamReader hat da einen Bug, denn der Dennis er selber behandelt die Zeilenumbrüche nicht selber.
Obwohl TStreamReader.ReadLine eigentlich diesbezüglich OK aussieht. (zumindestens hier im XE) - außer beim Speichern (und da war der erste Bug, welcher aber nicht zu diesem Fehler führt > Beim mehrmaligen Umstellen von Ident wird der Zeilenumbruch nicht wiederhergestellt) Ein kleines Demoprojekt wäre dennoch nett, da kann ich das dann nochmal einfach testen. > Allerdings für Windows, auch wenn es dort funktioniert. (iZeug hab ich nicht und ein Android-Delphi ist mir einfach zu teuer) Ein/zwei "Problemchen" hab ich jetzt beim Überfliegen des Codes schonmal entdeckt. |
AW: VerySimpleXML: Problem unter iOS?
Ich kann den Fehler mit folgendem Code reproduzieren:
Delphi-Quellcode:
Ich dachte zunächst dass es vielleicht ein Encoding-Problem sein könnte, aber es funktioniert weder im ANSI noch im UTF8-Format. Bedenklich dabei ist aber das unterschiedliche Verhalten zwischen Windows und iOS.
const
Filename = 'verysimplexml.xml'; var XMLFile : string; XMLObj : TXmlVerySimple; begin XMLFile := TPath.GetDocumentsPath+TPath.DirectorySeparatorChar+FileName; if not FileExists(XMLFile) then ShowMessage('Datei existiert nicht') else begin XMLObj := TXmlVerySimple.Create; XMLObj.LoadFromFile(XMLFile); Memo1.Lines.Text := XMLObj.Text; XMLObj.Free; end; end; |
AW: VerySimpleXML: Problem unter iOS?
Zitat:
|
AW: VerySimpleXML: Problem unter iOS?
Wenn Du mir ein komplettes Testprojekt (incl. Testdateien) für iOS (unter welcher Version testest Du es?) schickst, dann kann ich ja mal nach dem Fehler suchen. Eventuell ists auch wirklich der TStreamReader, möglicherweise lässt sich da was umstellen - ich debugge es gerne
|
AW: VerySimpleXML: Problem unter iOS?
Wie sieht es denn hier aus?
Delphi-Quellcode:
XMLObj.Ident := '';
Memo1.Lines.Text := XMLObj.Text; |
AW: VerySimpleXML: Problem unter iOS?
Zitat:
|
AW: VerySimpleXML: Problem unter iOS?
Liste der Anhänge anzeigen (Anzahl: 1)
Anbei ein Demoprojekt inklusive der beanstandeten XML-Datei. Suchpfad (.\source) und Bereitstellung (StartUp\Documents) für die XML-Datei sind ggf noch anzupasssen.
|
AW: VerySimpleXML: Problem unter iOS?
Ich prüfe es dann nach der Arbeit nochmal und lad es hier zum Testen hoch.
Wie gesagt, diese Dinge haben aber erstmal mir dem hier genannten Problem nichts zu tun. - bissl Unicode-Zeugs, potentielle Speicherlecks (die aber en nicht oft auftreten sollten), ... - das mit dem Zeilenumbruch
Delphi-Quellcode:
(daß sich die klasse bei so einigen Dingen nicht an die XML-Deklaration halten, ignorier ich hier einfach mal ... dafür isses halt klein und "einfach")
function TXmlVerySimple.GetText: String;
begin Lines.Clear; Lines.LineBreak := IfThen(Ident = '', '', sLineBreak); Ich hoffe mal das hier gibt den ersten Node zurück:
Delphi-Quellcode:
Was zeigt da denn das Memo an?
Memo1.Lines.Text := '"' + XMLObj.Root.ChildNodes[0].Text + '"';
> Also ob der Fehler schon beim Einlesen oder erst beim Speichern auftritt. |
AW: VerySimpleXML: Problem unter iOS?
Liste der Anhänge anzeigen (Anzahl: 1)
Vielen Dank für eure Antworten!
Zitat:
Ein Testprojekt lade ich gleich hoch, wobei dieser sich nicht viel von Unions Testcode unterscheiden wird. Ich spare mir nur den Zugriff auf die Dateisystem, indem ich mir eine fertige XML-Datei vom Webserver lade. Ansonsten alles gleich. Zitat:
|
AW: VerySimpleXML: Problem unter iOS?
Wenn das die XML ist, dann sollte es nicht am StreamReader liegen, oder zeigt bei jemandem der Debugger in der Variable "Line" ein zeichen "A" und "<" an?
(sollte nicht, da Keines da ist) - wenn das "Zeichen" in XMLNode.Text drin ist, dann ist es eher eine Art "Buffer-Overrun" in der Parse-Funktion des TVerySimpleXML - oder es ist ein "Bug" beim Zusammenbauen der XML-Ausgabe im TVerySimpleXML (wäre ungewöhnlich, wenn der erst im StreamWriter auftritt) |
AW: VerySimpleXML: Problem unter iOS?
Das Problem liegt wohl in der Verarbeitung der letzten Verschachtelungsebene:
Delphi-Quellcode:
Das ergibt immer true, da auf Node.Text abgefragt wird - der ist ja bei einem schließenden Tag in dem Fall immer leer. Es sollte zusätzlich Node.Parent.Text überprüft werden um das Flag zu setzen.
IsSelfClosing := (Length(Node.Text) = 0) and (Node.ChildNodes.Count = 0)
|
AW: VerySimpleXML: Problem unter iOS?
Zitat:
<nixdrin/> oder <nixdrin></nixdrin> das ist unabhängig vom Parent Text |
AW: VerySimpleXML: Problem unter iOS?
Zitat:
|
AW: VerySimpleXML: Problem unter iOS?
Unter welcher Delphi Version tritt denn das Problem auf?
|
AW: VerySimpleXML: Problem unter iOS?
Liste der Anhänge anzeigen (Anzahl: 1)
Bei mir XE5. Schau mal das debug im Bild. Du siehst dass in S bereits " </Z" steht und IsSelfClosing auf True gesetzt wurde. Dadurch wird dann ein weiteres " /" angehängt. Passiert im GetText in der 12. Recursion von Walk().
|
AW: VerySimpleXML: Problem unter iOS?
Zitat:
|
AW: VerySimpleXML: Problem unter iOS?
Aber nur unter iOS? Unter Windows tuts bei mir.
Ich muss das mit iOS jetzt erstmal einrichten ;-) |
AW: VerySimpleXML: Problem unter iOS?
Liste der Anhänge anzeigen (Anzahl: 1)
Ich hab da mal ne 1.4 von der XML-Unit, da war noch was mit UTF im header in der v1.3 behoben, möglicherweise wars das dann schon?
|
AW: VerySimpleXML: Problem unter iOS?
Ist die 1.4 von Dennis?
|
AW: VerySimpleXML: Problem unter iOS?
Zitat:
|
AW: VerySimpleXML: Problem unter iOS?
Also ich denke ich weiss woher's kommt:
zeile 240:
Delphi-Quellcode:
die bricht zu früh ab - Die Variable Line sollte danach direkt mit "<" anfangen,
while (Length(Line) > 0) and (Line[1] <> '<') do
delete(Line, 1, 1); tut es aber nicht: " <A..", also ein Leerzeichen zuviel. Erst dachte ich, ah ok, wir indizieren jetzt dann wie angekündigt mit 0, aber ein Line[0] meckert rum. Mal sehen wie ich das kompensieren kann... |
AW: VerySimpleXML: Problem unter iOS?
Das ist wohl ein Fehler in system. Die Schleife wird einmal durchlaufen und das delete wird durchgeführt. Dann wird die Abfrage true. Nach Verlassen der Schleife ist jedoch noch eine Leerstelle am Anfang von Line.
|
AW: VerySimpleXML: Problem unter iOS?
Zitat:
|
AW: VerySimpleXML: Problem unter iOS?
So, das ist ja wirklich lustig.
Debug Point bei Zeile 240:
Delphi-Quellcode:
Dann den Header einmal überspringen, bis <doc> drin steht (also zweite line). Der Aufruf
Line := Lines[I];
Delphi-Quellcode:
Macht auf Win32 das was es soll: Nämlich gar nix mit der Line, da die mit Line[1]='<' anfängt. Unter iOS allerdings schon, der Debugger sagt zwar
while (Length(Line) > 0) do
begin .. while (Length(Line) > 0) and (Line[1] <> '<') do delete(Line, 1, 1); Line[1]<>'<' => False aber hüpft trotzdem in die delete routine. Mach ich jetzt mal ein verwegenes
Delphi-Quellcode:
also mit Index = 0 draus, dann tuts. Hab ich was verpasst? Indizieren wir die Strings jetzt unter NextGen mit 0? Mir war da was.. aber ich find grad nix auf anhieb im web
while (Length(Line) > 0) do
begin .. while (Length(Line) > 0) and (Line[0] <> '<') do delete(Line, 1, 1); Nachtrag: {$ZEROBASEDSTRINGS OFF} oben im Kopf in der unit XML.VerysimpleXML reinpappen und schon gehts.... also doch 0-Index Strings in NExtGen... na da muss ja mal einer draufkommen... |
AW: VerySimpleXML: Problem unter iOS?
|
AW: VerySimpleXML: Problem unter iOS?
Das Beste ist ja der Debugger: Line[0] kann man dort nicht auswerten, im iOS-Code aber doch. Dadruch kann man NextGen-Programm nicht mehr debuggen bis man dem Debugger mitteilen kann, dass 0-Based strings verwendet werden.
|
AW: VerySimpleXML: Problem unter iOS?
Nachtrag:
Da ist immer noch ein Bug im Encoding header drin (zwei ? am ende), ich werde mal die 1.4 auf 1.5 updaten mit allen Fixes, dann packe ich die auf die Webseite. Eine Update-Meldung kommt dann auch hier. |
AW: VerySimpleXML: Problem unter iOS?
Zitat:
|
AW: VerySimpleXML: Problem unter iOS?
Zitat:
|
AW: VerySimpleXML: Problem unter iOS?
Zitat:
|
AW: VerySimpleXML: Problem unter iOS?
Naja, was gibts denn für ne *schöne* plattformübergreifende Alternative um auf das erste Zeichen im String zuzugreifen (etwa StringBuilder?) ohne Zerobased off zu verwenden?
Also
Delphi-Quellcode:
?
if (Length(Line) > 0) and (Line[1]='x') then
bla |
AW: VerySimpleXML: Problem unter iOS?
Zitat:
|
AW: VerySimpleXML: Problem unter iOS?
Zitat:
|
AW: VerySimpleXML: Problem unter iOS?
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:37 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