Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Cross-Platform-Entwicklung (https://www.delphipraxis.net/91-cross-platform-entwicklung/)
-   -   VerySimpleXML: Problem unter iOS? (https://www.delphipraxis.net/178157-verysimplexml-problem-unter-ios.html)

romber 20. Dez 2013 00:16

VerySimpleXML: Problem unter iOS?
 
Hallo!

Ich teste gerade einen Cross-Platform XML Parser namens "VerySimpleXML". Unter Windows und OS X functioniert alles perfekt. Unter iOS wird die XML-Code falsch eingelesen, so dass aus einfachen

Code:
<?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>
nach dem Einlesen so was wird:

Code:
<?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>
Kann mir jemand Helfen die Problemstelle zu finden?
Im Voraus vielen Dank!

cydo 20. Dez 2013 07:09

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?

romber 20. Dez 2013 07:47

AW: VerySimpleXML: Problem unter iOS?
 
Zitat:

Zitat von cydo (Beitrag 1240476)
Wie kommst Du darauf, dass der Cross-Plattform ist?

In der Source habe ich keine plattformspezifische Code gefunden. Auch auf einer Seite, wo mehrere Parser vergliechen werden, wurde dieser Parser als Cross-Plattform angegeben.

Bernhard Geyer 20. Dez 2013 07:55

AW: VerySimpleXML: Problem unter iOS?
 
Zitat:

Zitat von romber (Beitrag 1240485)
In der Source habe ich keine plattformspezifische Code gefunden. Auch auf einer Seite, wo mehrere Parser vergliechen werden, wurde dieser Parser als Cross-Plattform angegeben.

Wenn kein Plattformspezfischer Code verwendet wird ist er Plattformunabhängig.
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.

romber 20. Dez 2013 08:09

AW: VerySimpleXML: Problem unter iOS?
 
Wäre sehr danbar, wenn Sie mir bei der Fehlersuche helfen würden. Danke!

Union 20. Dez 2013 11:00

AW: VerySimpleXML: Problem unter iOS?
 
Wie erhältst Du die Ausgabe? Bitte mal Demo Source posten.

himitsu 20. Dez 2013 11:46

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.

Union 20. Dez 2013 11:59

AW: VerySimpleXML: Problem unter iOS?
 
Ich kann den Fehler mit folgendem Code reproduzieren:
Delphi-Quellcode:
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;
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.

mkinzler 20. Dez 2013 12:10

AW: VerySimpleXML: Problem unter iOS?
 
Zitat:

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.
Sind ja auch verschiedene Compiler, könnte also schon an Änderungen des Verhaltens des nextgen compilers liegen

cydo 20. Dez 2013 12:13

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

himitsu 20. Dez 2013 12:14

AW: VerySimpleXML: Problem unter iOS?
 
Wie sieht es denn hier aus?
Delphi-Quellcode:
XMLObj.Ident := '';
Memo1.Lines.Text := XMLObj.Text;

cydo 20. Dez 2013 12:15

AW: VerySimpleXML: Problem unter iOS?
 
Zitat:

Zitat von himitsu (Beitrag 1240522)
Ein/zwei "Problemchen" hab ich jetzt beim Überfliegen des Codes schonmal entdeckt.

Super, welche denn?

Union 20. Dez 2013 12:22

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.

himitsu 20. Dez 2013 12:25

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:
function TXmlVerySimple.GetText: String;
begin
  Lines.Clear;
  Lines.LineBreak := IfThen(Ident = '', '', sLineBreak);
(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")



Ich hoffe mal das hier gibt den ersten Node zurück:
Delphi-Quellcode:
Memo1.Lines.Text := '"' + XMLObj.Root.ChildNodes[0].Text + '"';
Was zeigt da denn das Memo an?
> Also ob der Fehler schon beim Einlesen oder erst beim Speichern auftritt.

romber 20. Dez 2013 12:31

AW: VerySimpleXML: Problem unter iOS?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Vielen Dank für eure Antworten!

Zitat:

Zitat von himitsu (Beitrag 1240522)
Ich glaub fast der TStreamReader hat da einen Bug, denn der Dennis er selber behandelt die Zeilenumbrüche nicht selber.

Ich habe mir tetweise eine zusätzliche Funktion LoadFromXML gebaut ohne TStreamReader, die unter Windows ebenfalls pergekt funktioniert. Unter iOS ist das Ergebnis der selbe.

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:

Zitat von cydo (Beitrag 1240528)
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

Mache ich gleich. Danke!

himitsu 20. Dez 2013 12:32

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)

Union 20. Dez 2013 12:45

AW: VerySimpleXML: Problem unter iOS?
 
Das Problem liegt wohl in der Verarbeitung der letzten Verschachtelungsebene:
Delphi-Quellcode:
IsSelfClosing := (Length(Node.Text) = 0) and (Node.ChildNodes.Count = 0)
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.

cydo 20. Dez 2013 12:52

AW: VerySimpleXML: Problem unter iOS?
 
Zitat:

Zitat von Union (Beitrag 1240539)
Das Problem liegt wohl in der Verarbeitung der letzten Verschachtelungsebene:
Delphi-Quellcode:
IsSelfClosing := (Length(Node.Text) = 0) and (Node.ChildNodes.Count = 0)
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.

Nee, Isselfclosing fragt sowas ab:

<nixdrin/>
oder <nixdrin></nixdrin>

das ist unabhängig vom Parent Text

cydo 20. Dez 2013 12:53

AW: VerySimpleXML: Problem unter iOS?
 
Zitat:

Zitat von romber (Beitrag 1240535)
Ich habe mir tetweise eine zusätzliche Funktion LoadFromXML gebaut ohne TStreamReader, die unter Windows ebenfalls pergekt funktioniert. Unter iOS ist das Ergebnis der selbe.

ja die version 1.0 von xmlverysimple ist auch ohne tstreamreader

cydo 20. Dez 2013 12:54

AW: VerySimpleXML: Problem unter iOS?
 
Unter welcher Delphi Version tritt denn das Problem auf?

Union 20. Dez 2013 13:00

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().

romber 20. Dez 2013 13:01

AW: VerySimpleXML: Problem unter iOS?
 
Zitat:

Zitat von cydo (Beitrag 1240544)
Unter welcher Delphi Version tritt denn das Problem auf?

Ich teste es unter XE5.

cydo 20. Dez 2013 13:03

AW: VerySimpleXML: Problem unter iOS?
 
Aber nur unter iOS? Unter Windows tuts bei mir.

Ich muss das mit iOS jetzt erstmal einrichten ;-)

cydo 20. Dez 2013 13:10

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?

Insider2004 20. Dez 2013 13:40

AW: VerySimpleXML: Problem unter iOS?
 
Ist die 1.4 von Dennis?

cydo 20. Dez 2013 13:51

AW: VerySimpleXML: Problem unter iOS?
 
Zitat:

Zitat von Insider2004 (Beitrag 1240552)
Ist die 1.4 von Dennis?

ja, ich bins ;-)

cydo 20. Dez 2013 14:42

AW: VerySimpleXML: Problem unter iOS?
 
Also ich denke ich weiss woher's kommt:

zeile 240:
Delphi-Quellcode:
while (Length(Line) > 0) and (Line[1] <> '<') do
          delete(Line, 1, 1);
die bricht zu früh ab - Die Variable Line sollte danach direkt mit "<" anfangen,
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...

Union 20. Dez 2013 15:10

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.

Insider2004 20. Dez 2013 15:12

AW: VerySimpleXML: Problem unter iOS?
 
Zitat:

Zitat von cydo (Beitrag 1240554)
Zitat:

Zitat von Insider2004 (Beitrag 1240552)
Ist die 1.4 von Dennis?

ja, ich bins ;-)

Das kann wohl jeder sagen! ;-)

cydo 20. Dez 2013 15:17

AW: VerySimpleXML: Problem unter iOS?
 
So, das ist ja wirklich lustig.
Debug Point bei
Zeile 240:
Delphi-Quellcode:
    Line := Lines[I];
Dann den Header einmal überspringen, bis <doc> drin steht (also zweite line). Der Aufruf

Delphi-Quellcode:
    while (Length(Line) > 0) do
    begin
     ..
        while (Length(Line) > 0) and (Line[1] <> '<') do
          delete(Line, 1, 1);
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
Line[1]<>'<' => False aber hüpft trotzdem in die delete routine. Mach ich jetzt mal ein verwegenes


Delphi-Quellcode:
    while (Length(Line) > 0) do
    begin
      ..
        while (Length(Line) > 0) and (Line[0] <> '<') do
          delete(Line, 1, 1);
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

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...

Insider2004 20. Dez 2013 15:21

AW: VerySimpleXML: Problem unter iOS?
 
http://docwiki.embarcadero.com/RADSt...rings_(Delphi)

Union 20. Dez 2013 15:25

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.

cydo 20. Dez 2013 15:26

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.

mkinzler 20. Dez 2013 15:27

AW: VerySimpleXML: Problem unter iOS?
 
Zitat:

Zitat von cydo (Beitrag 1240561)
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...

Besser wäre es aber, den Code so anzupassen, dass es ohne diese Einstellung funktioniert.

Insider2004 20. Dez 2013 15:27

AW: VerySimpleXML: Problem unter iOS?
 
Zitat:

Zitat von cydo (Beitrag 1240565)
Nachtrag:
Da ist immern och 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 Webseite. Update-Meldung kommt dann auch hier.

Super Weihnachtsgeschenk!

Insider2004 20. Dez 2013 15:29

AW: VerySimpleXML: Problem unter iOS?
 
Zitat:

Zitat von mkinzler (Beitrag 1240566)
Zitat:

Zitat von cydo (Beitrag 1240561)
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...

Besser wäre es aber, den Code so anzupassen, dass es ohne diese Einstellung funktioniert.

Da wäre ich dagegen. Das Ding sollte auch auf normalen Compilern (ohne ZBS) laufen.

cydo 20. Dez 2013 15:40

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
?

mkinzler 20. Dez 2013 15:40

AW: VerySimpleXML: Problem unter iOS?
 
Zitat:

Zitat von Insider2004 (Beitrag 1240568)
Zitat:

Zitat von mkinzler (Beitrag 1240566)
Zitat:

Zitat von cydo (Beitrag 1240561)
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...

Besser wäre es aber, den Code so anzupassen, dass es ohne diese Einstellung funktioniert.

Da wäre ich dagegen. Das Ding sollte auch auf normalen Compilern (ohne ZBS) laufen.

So meinte ich das auch. War vielleicht nicht ganz deutlich. Er sollte es so anpassen, dass es unabhängig von dieser Einstellung funktioniert; mit der jeweiligen Grenzen des Compilers

mkinzler 20. Dez 2013 15:41

AW: VerySimpleXML: Problem unter iOS?
 
Zitat:

Zitat von cydo (Beitrag 1240570)
Naja, was gibts denn für ne *schöne* plattformübergreifende Alternative um auf das erste Zeichen im String zuzugreifen (etwa StringBuilder)?
Also

Delphi-Quellcode:
if Line[1]='x' then
 bla
?

Nicht 1 nehmen sondern die jeweilige untere Grenze ( z.B. Konstante)

Union 20. Dez 2013 15:42

AW: VerySimpleXML: Problem unter iOS?
 
Zitat:

Zitat von cydo (Beitrag 1240570)
Naja, was gibts denn für ne *schöne* plattformübergreifende Alternative um auf das erste Zeichen im String zuzugreifen (etwa StringBuilder)?
Also

Delphi-Quellcode:
if Line[1]='x' then
 bla
?

Z.b. mit Copy.


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:18 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz