Qt 6 是努力使框架更高效,且更易于使用的结果。
We try to maintain binary and source compatibility for all the public APIs in each release. But some changes were inevitable in an effort to make Qt a better framework and align with modern standards.
Qt 6 enforces XML 1.0 rules more strictly than Qt 5. In Qt 5,the XML parser was more lenient, allowing certain constructs that were not compliant with the XML 1.0 specification. Qt 6 corrects this behavior, ensuring that XML handling follows the standard properly. If your application relies on behavior that was incorrectly permitted in Qt 5, you may need to adjust your XML documents or processing logic accordingly.
For more details on XML 1.0 rules, see the official W3C XML specification: Extensible Markup Language (XML) 1.0 (Fifth Edition)
In this topic we summarize those changes in Qt XML, and provide guidance to handle them.
所有 SAX classes have been removed from Qt XML. Use QXmlStreamReader for reading XML files. Here are some simple steps to port your current code to QXmlStreamReader :
例如,若有代码像
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 }
可以把它重写成
QFile file = ...; QXmlStreamReader reader(&file); while (!reader.atEnd()) { reader.readNext(); ... // do processing } if (reader.hasError()) { ... // do error handling }
As SAX classes have been removed from Qt XML, QDomDocument has been re-implemented using QXmlStreamReader . This causes a few behavioral changes:
<tag attr=" a \n b " />
相当于
<tag attr="a b"/>
.
For more details see: Attribute-Value Normalization in XML 1.0
In Qt 6, control characters such as U+0000—U+001F, U+007F, and U+0080—U+009F are now correctly rejected per XML 1.0 rules. They were incorrectly allowed in Qt 5. Before using XML with Qt6 ensure that your XML documents contain only valid XML 1.0-compliant characters. If control characters are necessary, encode them using text-safe format.
For more details see: Characters in XML 1.0
In Qt 6, HTML entities are no longer valid unless explicitly declared in a Document Type Definition (DTD). In Qt 5, certain HTML-specific entities (e.g.,
) were allowed, even without declaration. To ensure compatibility in Qt 6 use numeric character references, define required entities in a DTD or if your content relies on HTML entities, process the XML as HTML instead.
For more details see: Character Encoding in Entities in XML 1.0
By default, text nodes containing only spacing characters are stripped and won't appear in the
QDomDocument
. The Qt 5 way of changing this behavior was using the
QDomDocument::setContent
() overload that allowed a
QXmlReader
to be supplied. That overload was removed in Qt 6.0, but since Qt 6.5, you can pass
QDomDocument::ParseOption::PreserveSpacingOnlyNodes
as a parse option, to specify that spacing-only text nodes must be preserved.
若使用 QDomDocument and rely on any of these, you must update your code and XML documents accordingly.
If your application or library cannot be ported right now, the
QXmlSimpleReader
and related classes still exist in Qt5Compat to keep old code-bases working. If you want to use those SAX classes further, you need to link against the new Qt5Compat module and add this line to your
qmake
.pro
文件:
QT += core5compat
In case you already ported your application or library to the
cmake
build system, add the following to your
CMakeList.txt
:
PUBLIC_LIBRARIES
Qt::Core5Compat