本页内容

QXmlStreamEntityResolver Class

QXmlStreamEntityResolver 类为QXmlStreamReader 提供了一个实体解析器。更多内容...

标题: #include <QXmlStreamEntityResolver>
CMake: find_package(Qt6 REQUIRED COMPONENTS Core)
target_link_libraries(mytarget PRIVATE Qt6::Core)
qmake: QT += core

注意:该类中的所有函数均为可重入的。

公共函数

QXmlStreamEntityResolver()
virtual ~QXmlStreamEntityResolver()
virtual QString resolveUndeclaredEntity(const QString &name)

详细说明

用于告知QXmlStreamReader 如何展开非declared in the internal-set of the DTD 的实体。

安全注意事项

实体循环

必须注意避免实体解析形成循环,因为QXmlStreamReader 仅会在entities defined in the DTD 中检测并拒绝循环,而不会在从QXmlStreamEntityResolver接口实现类扩展出的实体中进行检测。

这是设计使然:QXmlStreamReader 将这项工作交由具体的 QXmlStreamEntityResolver 实现来处理。对于静态映射(例如字符的 XML 实体定义),这一点显然是得到保证的,因此在后台进行追踪只会拖慢所有用户的运行速度。

当从外部输入(包括不可信来源)读取实体定义时,情况就变得有趣了。在这种情况下,您的实现必须确保用作输入的展开结果不包含循环。这是一种简单的图操作,可以在线性时间和空间内实现,并且可以在加载时提前执行,因此不会影响resolveUndeclaredEntity() 的性能。

实体展开限制

目前,由该类解析的实体不会计入QXmlStreamReader::entityExpansionLimit()的计数。这一行为在Qt XML的未来版本中可能会发生变化。

目前,如果您从外部输入中读取实体定义,则需要自行设置一定的扩展上限。在检测到循环后,最长路径计算是一项简单的图操作,可在线性时间和空间内实现,并且可以在加载时预先执行,因此它也不会影响resolveUndeclaredEntity()的性能。

另请参阅 QXmlStreamReader::setEntityResolver()。

成员函数文档

[constexpr noexcept default] QXmlStreamEntityResolver::QXmlStreamEntityResolver()

默认——构造一个QXmlStreamEntityResolver 的实例。

[virtual noexcept] QXmlStreamEntityResolver::~QXmlStreamEntityResolver()

销毁实体解析器。

[virtual] QString QXmlStreamEntityResolver::resolveUndeclaredEntity(const QString &name)

重写此函数以解析未声明的实体name ,并返回其替换文本。如果实体解析器不认识该实体,则返回null string:QString() 。这将在 QXmlStreamreader 中引发错误。一个为空但非空的字符串被视为该实体的有效展开,不会引发错误。

默认实现始终返回QString() 。

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