SaveXML() Fehler

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
PureBuster
Beiträge: 40
Registriert: 30.05.2008 09:54
Computerausstattung: erbärmlich
Wohnort: Niedersachsen / Bremen

SaveXML() Fehler

Beitrag 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?
...coden ist wie zum Psychoklempner gehn...manchmal muss man einfach drüber reden..
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: SaveXML() Fehler

Beitrag 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
a²+b²=mc²
Benutzeravatar
PureBuster
Beiträge: 40
Registriert: 30.05.2008 09:54
Computerausstattung: erbärmlich
Wohnort: Niedersachsen / Bremen

Re: SaveXML() Fehler

Beitrag 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
...coden ist wie zum Psychoklempner gehn...manchmal muss man einfach drüber reden..
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: SaveXML() Fehler

Beitrag 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
a²+b²=mc²
Benutzeravatar
PureBuster
Beiträge: 40
Registriert: 30.05.2008 09:54
Computerausstattung: erbärmlich
Wohnort: Niedersachsen / Bremen

Re: SaveXML() Fehler

Beitrag von PureBuster »

100%-Treffer THX :bounce:
...coden ist wie zum Psychoklempner gehn...manchmal muss man einfach drüber reden..
Benutzeravatar
Sebastian
Beiträge: 322
Registriert: 14.06.2006 16:46
Wohnort: Kiel

Re: SaveXML() Fehler

Beitrag von Sebastian »

Der Tipp ist Gold wert. Danke. Und das auch nach so langer Zeit...
(Win 11 64-bit, PB 6.04 und 6.10)
Antworten