Qt XML 的变更

Qt 6 是为了使框架更加高效和易于使用而进行的自觉努力的结果。

我们试图在每次发布中维护所有公共 API 的二进制和源代码兼容性。但在使 Qt 成为更好的框架的努力中,一些变更不可避免。

在本主题中,我们总结了 Qt XML 的这些变更,并提供了解决这些变更的指导。

XML (SAX) 解析器的简单 API

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

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

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

如果您使用 QDomDocument 并依赖于这些中的任何一个,则必须相应更新您的代码和 XML 文档。

仅包含空格的文本节点

默认情况下,仅包含空格字符的文本节点将被删除,且不会出现在 QDomDocument 中。Qt 5 中改变这种行为的做法是使用允许提供 QXmlReaderQDomDocument::setContent() 虚函数的覆盖。该覆盖在 Qt 6.0 中被删除,但由于 Qt 6.5,您可以通过将 QDomDocument::ParseOption::PreserveSpacingOnlyNodes 作为解析选项传递,来指定必须保留仅包含空格的文本节点。

Qt Core5 兼容库

如果您的应用程序或库目前无法移植,Qt5Compat 中的 QXmlSimpleReader 和相关类仍然存在,以保持旧代码库的正常工作。如果您想进一步使用这些 SAX 类,则需要链接到新的 Qt5Compat 模块,并在您的 qmake .pro 文件中添加此行

QT += core5compat

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

PUBLIC_LIBRARIES
    Qt::Core5Compat

© 2024 Qt公司有限公司。本文件中包含的文档贡献归各自所有者所有版权。所提供的文档使用GNU自由文档许可证版本1.3的条款进行许可,该许可证由自由软件基金会发布。Qt以及相应的商标是芬兰和/或其他国家/地区的Qt公司有限公司的商标。商标。所有其他商标均属其各自所有者。