Seite 1 von 1

SaveXML() Fehler

Verfasst: 17.03.2010 13:27
von PureBuster
Moin zusammen,
mglw. habe ich da einen Bug in der xml-lib entdeckt (Pb 4.40 x86) und vielleicht kann das mal wer validieren:

wenn ich ein xml-File mittels LoadXML() geladen habe und es anschliessen wieder mit SaveXML() abspeichere werden sog. inline-Elemente zerschossen. Konkretes Beispiel:

aus:

<?xml version="1.0"?>
<text>Ich bin ein CDATA Text und werde später mal ab <hervorheben>hier irgendwie hervorgehoben, z.B. durch Fettdruck. Aber ab </hervorheben>hier werde ich wieder normal dargestellt.</text>

wird:

<?xml version="1.0"?>
<text>
Ich bin ein CDATA Text und werde später mal ab h
<hervorheben>
hier irgendwie hervorgehoben, z.B. durch Fettdruck. Aber ab
</hervorheben>
ier werde ich wieder normal dargestellt.
</text>

...man beachte das "h". Das stand vor dem Lade/Speicher-Vorgang hinter dem inline-Tag; bei einem weiteren Lade/Speicher-Vorgang wird übrigens das nächste Zeichen, also "i" verschoben usw.

Bislang kann ich das nur kompensieren, indem ich vor jedem Ladevorgang auf Textebene eine "Vorformatierung" durchführe. Für das Beispiel sieht das dann so aus:

aus:

<?xml version="1.0"?>
<text>
Ich bin ein CDATA Text und werde später mal ab
<hervorheben>
hier irgendwie hervorgehoben, z.B. durch Fettdruck. Aber ab
</hervorheben>
hier werde ich wieder normal dargestellt.
</text>

wird:

<?xml version="1.0"?>
<text>
Ich bin ein CDATA Text und werde später mal ab<hervorheben>
hier irgendwie hervorgehoben, z.B. durch Fettdruck. Aber ab
</hervorheben>hier werde ich wieder normal dargestellt.
</text>

...aber das kanns ja eigentlich nicht sein, oder?

Re: SaveXML() Fehler

Verfasst: 17.03.2010 13:42
von Kiffi
PureBuster hat geschrieben:...aber das kanns ja eigentlich nicht sein, oder?
doch, ist so. Das ist kein Bug im Expat-Parser.

Du musst Dich selber darum kümmern, was Du in die Nodes und Attribute
schreibst und gegebenenfalls kritische Zeichen vorher entweder encoden
oder mit CDATA klammern.

... oder Du benutzt den MSXML-Parser (in Kombination mit COMate). Dieser
hat die 'Komfort'-Funktionalität, dass er selber den Inhalt 'entschärft'.

Grüße ... Kiffi

Re: SaveXML() Fehler

Verfasst: 17.03.2010 14:06
von PureBuster
Ok, wenns denn so sein soll. Falls wer die Vorformatierung braucht:

Code: Alles auswählen

     If newstring$
     NewList row_newstring.s()
     ;Zeilenumbruch nach jedem Tag erzwingen
       While FindString(newstring$,">",1) And FindString(newstring$, ">",1) < Len(newstring$); nach jedem Tag
       toAddToList.i = FindString(newstring$,">",1)
       AddElement(row_newstring.s())
       row_newstring.s() = Mid(newstring$, 1, toAddToList)
       newstring$ = Mid(newstring$,toAddToList + 1)
       Wend
       If newstring$ <> ""
       AddElement(row_newstring.s())
       row_newstring.s() = newstring$
       EndIf
     ;Zeilenumbruch vor jedem Tag erzwingen
       ForEach row_newstring.s()
          If FindString(row_newstring.s(),"<",1) And FindString(row_newstring.s(),"<",1) >1; vor jedem Tag
          tosplit.i = FindString(row_newstring.s(), "<",1)
          tosplitGet$ = Mid(row_newstring.s(), tosplit) ; was danach steht
          row_newstring.s() = Mid(row_newstring.s(), 1, tosplit -1)
          AddElement(row_newstring.s())
          row_newstring.s() = tosplitGet$
          EndIf
        Next
       
     EndIf
;und alle Listenitems in eine Datei(1) schreiben:
        ForEach row_newstring.s()
          If row_newstring.s() <> "" And row_newstring.s() <> Chr(10)
          WriteStringN(1,row_newstring(),#PB_UTF8)
          EndIf
        Next

Re: SaveXML() Fehler

Verfasst: 17.03.2010 14:27
von Kiffi
ok. hab's grade nochmal getestet.

Dein Problem hängt wahrscheinlich damit zusammen, dass Du
eine im UTF-8 - Format gespeicherte XML-Datei lesen willst,
jedoch Deinen Code selber nicht auf Unicode umgestellt hast.

Mach das mal und Du wirst sehen, dass LoadXML() und
SaveXML() wie gewünscht funktionieren.

Grüße ... Kiffi

Re: SaveXML() Fehler

Verfasst: 17.03.2010 17:03
von PureBuster
100%-Treffer THX :bounce:

Re: SaveXML() Fehler

Verfasst: 04.03.2014 07:43
von Sebastian
Der Tipp ist Gold wert. Danke. Und das auch nach so langer Zeit...