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 中改变这种行为的做法是使用允许提供 QXmlReader
的 QDomDocument::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公司有限公司的商标。商标。所有其他商标均属其各自所有者。