Seite 1 von 1

QDomText

Verfasst: 17. Oktober 2007 19:45
von Dbug
Hallo allerseits...

ich erzeuge einen QDomText über

Code: Alles auswählen

doc.createTextNode(text)
wobei doc mein QDomDocument ist.

Wenn in diesem Text jetzt ein & ist wird daraus ein & was ich ja sehr schön finde.
Leider ist es aber bei Zeichen wie "<" nicht so und es wird kein ">" draus :/
Weiss jemand wie ich das hinbekomme? Weil sonst werden meine XML Tags leider zerschossen.
Ich hab noch den weg über selber replacen versucht, aber dann wird das > zu "&gt;" :/

Weiss jemand rat?

Qt Vers. 4.3.2

Re: QDomText

Verfasst: 10. September 2014 14:26
von BigMike
Hallo,

ich würde gerne diesen Beitrag wieder aufleben lassen, da ich gerade das gleiche Problem habe.
Kann mir jemand sagen, warum createTextNode zwar "<" richtig nach "<" wandelt, aber ">" nicht?
Eine Manipulation vorab funktioniert nicht, da "&" aus "<" korrekt nach "&" gewandelt wird und daraus dann "&lt;" entsteht.

Vielen Dank für eure Hilfe.

Re: QDomText

Verfasst: 10. September 2014 19:20
von nebler
Hallo,

ist zwar nur ein Work-Around aber sollte zur Problembehbung reichen:
Anstelle von

Code: Alles auswählen

QDomNode node = doc.createTextNode( "a < b > c & d" );
Nehme:

Code: Alles auswählen

QDomNode node = doc.createCDATASection("a > b & c = <value>");
Viele Grüße

PS: Ich habe keine Ahnung warum er > nicht mitkonvertiert ...

Re: QDomText

Verfasst: 11. September 2014 12:48
von BigMike
Hallo,

danke nebler für deine schnelle Antwort.

Leider funktioniert dies so nicht.
An dem zu wandelnden String "String mit <XYZ>" ändert sich gar nichts, er wird lediglich in "![CDATA[String mit <XYZ>]]" geklammert.

Hast du oder jemand Anderes noch weitere Ideen?

Viele Grüße

Re: QDomText

Verfasst: 11. September 2014 18:11
von nebler
Hallo BigMike,

unter der CDATA-Section darf <, >, & ... stehen.
Daher passt das doch.

Das müsste somit well-formed sein.

== EDIT ==
Testcode:

Code: Alles auswählen

    QString documentString;
    const QString value = "a > b & c = <value>";

    { // create DOM document
      QDomDocument doc;
      QDomNode rootNode = doc.createElement( "root" );
      doc.appendChild( rootNode );
      QDomText txtNode = doc.createCDATASection( value );
      rootNode.appendChild( txtNode );
      documentString = doc.toString();
    }

    { // read DOM document
      QDomDocument doc;
      doc.setContent( documentString );
      
      QDomNodeList childs = doc.childNodes();
      assert( childs.size() == 1 );

      QDomNode child = childs.at( 0 ); // root element
      QDomNode content = child.childNodes().at( 0 ); // content element
      assert( content.isText() );

      QDomText txtNode = content.toText();
      assert( value == txtNode.data() );
    }
Viele Grüße

Re: QDomText

Verfasst: 12. September 2014 12:42
von BigMike
Hallo nebler,

ich glaube du hast mein Problem nicht richtig verstanden.
Ich möchte nicht, dass die Zeichen erhalten bleiben, sondern sie sollen durch die HTML-Zeichen ersetzt werden.
Es handelt sich um einen Konverter, welcher u.a. Strings aus einer ini-Datei in XML-Format wandelt.
Leider sind in diesen Strings auch "<>&" erlaubt.

createTextNode() sollte normalerweise den String so wandeln, dass er innerhalb eines Tags verwendet werden kann.
Leider funktioniert dies aber nicht beim ">" und dadurch wird vorzeitig ein Tag-Ende erkannt und die ganze Syntax dadnach passt nicht mehr.

Meiner Meinung nach ist dies ein Fehler in createTextNode().

Ich suche nun einen Weg, dieses Problem zu umgehen.

Der Zielstring sollte so aussehen: "String mit <XYZ$gt;"

Viele Grüße

Re: QDomText

Verfasst: 12. September 2014 13:15
von nebler
Hallo BigMike,

ja, ich sehe das auch so, dass dort ein Fehler ist in Qt.

ABER Du willst ein gültiges XML Dokument haben, warum passt Dir dann dieser Lösungsweg nicht?
Das Endergebnis ist doch genau das, was Du haben möchtest -> well-formed XML.

Wenn Du allerdings auf CDATA verzichten möchtest, dann schreib Dir doch selber den Konverter ohne Qt.
Wenn Dein XML Reader nicht mit CDATA umgehen kann, dann fehlt hier auch noch das Feature.

Viele Grüße

Re: QDomText

Verfasst: 15. September 2014 10:29
von BigMike
Hallo nebler,

vielen Dank für deine Hilfe.

Die Idee den Konverter selber zu schreiben hatte ich auch schon, wollte aber gerne den Aufwand vermeiden.
Die resultierende XML-Datei wird von unterschiedlichen Stellen verwendet.
Da muss ich erst mal prüfen, ob diese alle mit CDATA-Format zurecht kommen.

Momentan komme ich allerdings nicht dazu, kann also etwas dauern.

Viele Grüße

Re: QDomText

Verfasst: 15. September 2014 19:54
von Christian81
If value contains characters which cannot be stored as character data of an XML document (even in the form of character references), the behavior of this function is governed by QDomImplementation::InvalidDataPolicy.
Steht also eindeutig da, dass dort nichts konvertiert wird.