对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 中的这些变化,并提供了处理这些变化的指南。
Simple API for XML (SAX) 解析器
所有SAX类都已从Qt XML 中删除。请使用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 中,U+0000-U+001F、U+007F 和 U+0080-U+009F 等控制字符现在已根据 XML 1.0 规则被正确拒绝。在 Qt XML 6 中使用 XML 之前,请确保 XML 文档只包含符合 XML 1.0 标准的有效字符。如果需要控制字符,请使用文本安全格式进行编码。
有关详细信息,请参阅XML 1.0 中的字符
XML 中的 HTML 实体
在 Qt 6 中,除非在文档类型定义(DTD)中明确声明,否则 HTML 实体不再有效。在 Qt 5 中,某些特定于 HTML 的实体(如
)即使没有声明也是允许的。为确保 Qt 6 的兼容性,请使用数字字符引用、在 DTD 中定义所需的实体,或者如果您的内容依赖于 HTML 实体,请将 XML 作为 HTML 处理。
更多详情,请参阅XML 1.0 实体中的字符编码
仅包含空格的文本节点
默认情况下,只包含间隔字符的文本节点会被剥离,不会出现在QDomDocument 中。Qt XML 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
© 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.