本页内容

变更内容Qt XML

Qt 6 中的变更,源于我们有意识地致力于让该框架更加高效且易于使用。

我们力求在每次发布中保持所有公共 API 的二进制和源代码兼容性。但为了使 Qt 成为更优秀的框架并符合现代标准,某些变更在所难免。

Qt 6 比 Qt 5 更严格地执行 XML 1.0 规则。在 Qt 5 中,XML 解析器较为宽松,允许某些不符合 XML 1.0 规范的结构。 Qt 6 纠正了这一行为,确保 XML 处理严格遵循标准。如果您的应用程序依赖于 Qt 5 中被错误允许的行为,您可能需要相应地调整 XML 文档或处理逻辑。

有关 XML 1.0 规则的更多详细信息,请参阅 W3C 官方 XML 规范:《可扩展标记语言 (XML) 1.0(第五版)》

在本主题中,我们将总结Qt XML 中的这些变更,并提供相应的处理指南。

XML 简单 API(SAX)解析器

Qt XML 中已移除了所有SAX类。请使用 `QXmlStreamReader ` 来读取 XML 文件。以下是将您当前的代码迁移到 `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
}

QDom 和 QDomDocument

由于SAX类已从Qt XML 中移除,QDomDocument 已使用QXmlStreamReader 重新实现。这会导致一些行为上的变化:

  • 属性值将被规范化。例如,<tag attr=" a \n b " /> 等同于<tag attr="a b"/> 。
  • 不再允许存在完全相同的限定属性名称。这意味着元素的属性必须具有唯一的名称。
  • 不再允许使用未声明的命名空间前缀。

更多详情请参阅:XML 1.0 中的属性值规范化

控制字符

在 Qt 6 中,根据 XML 1.0 规则,诸如 U+0000—U+001F、U+007F 以及 U+0080—U+009F 等控制字符现已被正确拒绝。 在 Qt 5 中,这些字符曾被错误地允许。在 Qt 6 中使用 Qt XML 之前,请确保您的 XML 文档仅包含符合 XML 1.0 规范的有效字符。如果必须使用控制字符,请使用文本安全格式对其进行编码。

更多详细信息请参阅:XML 1.0 中的字符

XML 中的 HTML 实体

在 Qt 6 中,除非在文档类型定义 (DTD) 中明确声明,否则 HTML 实体不再有效。 在 Qt 5 中,某些 HTML 特有的实体(例如:&nbsp; )即使未进行声明,也被允许使用。为确保在 Qt 6 中的兼容性,请使用数字字符引用,在 DTD 中定义所需的实体;或者,如果您的内容依赖于 HTML 实体,请将 XML 作为 HTML 进行处理。

更多详细信息请参阅:XML 1.0 中的实体字符编码

仅含空格的文本节点

默认情况下,仅包含空格字符的文本节点会被移除,且不会出现在QDomDocument 中。在 Qt 5 中,通过使用QDomDocument::setContent() 重载方法并传入QXmlReader 参数,可以更改此行为。 该重载方法在 Qt 6.0 中已被移除,但自 Qt 6.5 起,您可以将 `QDomDocument::ParseOption::PreserveSpacingOnlyNodes ` 作为解析选项传递,以指定必须保留仅包含间隔符的文本节点。

如果您使用的是QDomDocument 并依赖于上述任何功能,则必须相应地更新您的代码和XML文档。

Qt Core5 兼容库

如果您的应用程序或库目前无法移植,QXmlSimpleReader 及相关类在 Qt5Compat 中仍然存在,以确保旧代码库能够继续运行。如果您希望继续使用这些 SAX 类,则需要链接到新的 Qt5Compat 模块,并在您的qmake .pro 文件中添加以下行:

QT += core5compat

如果您已经将应用程序或库移植到CMake构建系统,请在CMakeList.txt 中添加以下内容:

PUBLIC_LIBRARIES
    Qt::Core5Compat

© 2026 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.