Die Änderungen an Qt XML

Qt 6 sind das Ergebnis des bewussten Bemühens, das Framework effizienter und benutzerfreundlicher zu gestalten.

Wir versuchen, die Binär- und Quellcodekompatibilität für alle öffentlichen APIs in jeder Version zu erhalten. Einige Änderungen waren jedoch unvermeidlich, um Qt zu einem besseren Framework zu machen und mit modernen Standards in Einklang zu bringen.

Qt 6 setzt die XML 1.0-Regeln strenger durch als Qt 5. In Qt 5 war der XML-Parser nachsichtiger und ließ bestimmte Konstrukte zu, die nicht mit der XML 1.0-Spezifikation konform waren. Qt 6 korrigiert dieses Verhalten und stellt sicher, dass die XML-Verarbeitung dem Standard entspricht. Wenn sich Ihre Anwendung auf ein Verhalten stützt, das in Qt 5 fälschlicherweise zugelassen wurde, müssen Sie Ihre XML-Dokumente oder Ihre Verarbeitungslogik möglicherweise entsprechend anpassen.

Weitere Einzelheiten zu den XML 1.0-Regeln finden Sie in der offiziellen W3C XML-Spezifikation: Extensible Markup Language (XML) 1.0 (Fünfte Ausgabe)

In diesem Thema fassen wir diese Änderungen unter Qt XML zusammen und geben Anleitungen zu ihrer Handhabung.

Einfache API für XML (SAX) Parser

Alle SAX-Klassen wurden aus Qt XML entfernt. Verwenden Sie QXmlStreamReader zum Lesen von XML-Dateien. Hier sind einige einfache Schritte, um Ihren aktuellen Code auf QXmlStreamReader zu portieren:

Wenn Sie zum Beispiel einen Code wie

QFile *file = new QFile(...);
QXmlInputSource *source = new QXmlInputSource(file);

Handler *handler = new Handler;

QXmlSimpleReader xmlReader;
xmlReader.setErrorHandler(handler);
xmlReader.setContentHandler(handler);

if (xmlReader.parse(source)) {
    ... // do processing
} else {
    ... // do error handling
}

haben, können Sie ihn umschreiben als

QFile file = ...;
QXmlStreamReader reader(&file);

while (!reader.atEnd()) {
    reader.readNext();
    ... // do processing
}
if (reader.hasError()) {
    ... // do error handling
}

QDom und QDomDocument

Da die SAX-Klassen aus Qt XML entfernt wurden, wurde QDomDocument mit QXmlStreamReader neu implementiert. Dies führt zu einigen Änderungen im Verhalten:

  • Die Attributwerte werden normalisiert. Zum Beispiel ist <tag attr=" a \n b " /> äquivalent zu <tag attr="a b"/>.
  • Identische qualifizierte Attributnamen sind nicht mehr erlaubt. Das bedeutet, dass die Attribute eines Elements eindeutige Namen haben müssen.
  • Nicht deklarierte Namespace-Präfixe sind nicht mehr erlaubt.

Für weitere Details siehe: Normalisierung von Attributwerten in XML 1.0

Steuerzeichen

In Qt 6 werden Steuerzeichen wie U+0000-U+001F, U+007F und U+0080-U+009F jetzt gemäß den XML 1.0-Regeln korrekt zurückgewiesen. Bevor Sie XML mit Qt6 verwenden, stellen Sie sicher, dass Ihre XML-Dokumente nur gültige XML 1.0-konforme Zeichen enthalten. Wenn Steuerzeichen erforderlich sind, kodieren Sie sie in einem textsicheren Format.

Für weitere Details siehe: Zeichen in XML 1.0

HTML-Entities in XML

In Qt 6 sind HTML-Entities nicht mehr gültig, wenn sie nicht explizit in einer Document Type Definition (DTD) deklariert sind. In Qt 5 waren bestimmte HTML-spezifische Entitäten (z.B. &nbsp;) auch ohne Deklaration erlaubt. Um die Kompatibilität in Qt 6 zu gewährleisten, verwenden Sie numerische Zeichenreferenzen, definieren Sie die erforderlichen Entities in einer DTD oder verarbeiten Sie das XML stattdessen als HTML, wenn Ihr Inhalt auf HTML-Entities beruht.

Für weitere Details siehe: Zeichenkodierung in Entities in XML 1.0

Textknoten, die nur Leerzeichen enthalten

Standardmäßig werden Textknoten, die nur Leerzeichen enthalten, entfernt und erscheinen nicht in QDomDocument. In Qt 5 konnte dieses Verhalten mit der QDomDocument::setContent()-Überladung geändert werden, die es erlaubte, ein QXmlReader zu übergeben. Diese Überladung wurde in Qt 6.0 entfernt, aber seit Qt 6.5 können Sie QDomDocument::ParseOption::PreserveSpacingOnlyNodes als Parse-Option übergeben, um festzulegen, dass Textknoten, die nur Leerzeichen enthalten, erhalten bleiben müssen.

Wenn Sie QDomDocument verwenden und sich auf eine dieser Optionen verlassen, müssen Sie Ihren Code und Ihre XML-Dokumente entsprechend aktualisieren.

Qt Core5 Kompatibilitätsbibliothek

Wenn Ihre Anwendung oder Bibliothek nicht sofort portiert werden kann, gibt es in Qt5Compat noch die QXmlSimpleReader und verwandte Klassen, um alte Code-Basen am Laufen zu halten. Wenn Sie diese SAX-Klassen weiter verwenden wollen, müssen Sie gegen das neue Qt5Compat-Modul linken und diese Zeile zu Ihrer qmake .pro Datei hinzufügen:

QT += core5compat

Falls Sie Ihre Anwendung oder Bibliothek bereits auf das cmake-Build-System portiert haben, fügen Sie die folgende Zeile in Ihre CMakeList.txt ein:

PUBLIC_LIBRARIES
    Qt::Core5Compat

© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.