本页内容

QXmlSimpleReader Class

QXmlSimpleReader 类提供了一个简单的 XML 解析器的实现。更多内容...

标题: #include <QXmlSimpleReader>
CMake: find_package(Qt6 REQUIRED COMPONENTS Core5Compat)
target_link_libraries(mytarget PRIVATE Qt6::Core5Compat)
qmake: QT += core5compat
继承自: QXmlReader

警告:此类不支持重入。

公共函数

QXmlSimpleReader()
virtual ~QXmlSimpleReader()
virtual bool parse(const QXmlInputSource *input, bool incremental)
virtual bool parseContinue()

重新实现的公共函数

virtual QXmlDTDHandler *DTDHandler() const override
virtual QXmlContentHandler *contentHandler() const override
virtual QXmlDeclHandler *declHandler() const override
virtual QXmlEntityResolver *entityResolver() const override
virtual QXmlErrorHandler *errorHandler() const override
virtual bool feature(const QString &name, bool *ok = nullptr) const override
virtual bool hasFeature(const QString &name) const override
virtual bool hasProperty(const QString &name) const override
virtual QXmlLexicalHandler *lexicalHandler() const override
virtual bool parse(const QXmlInputSource &input) override
virtual bool parse(const QXmlInputSource *input) override
virtual void *property(const QString &name, bool *ok = nullptr) const override
virtual void setContentHandler(QXmlContentHandler *handler) override
virtual void setDTDHandler(QXmlDTDHandler *handler) override
virtual void setDeclHandler(QXmlDeclHandler *handler) override
virtual void setEntityResolver(QXmlEntityResolver *handler) override
virtual void setErrorHandler(QXmlErrorHandler *handler) override
virtual void setFeature(const QString &name, bool enable) override
virtual void setLexicalHandler(QXmlLexicalHandler *handler) override
virtual void setProperty(const QString &name, void *value) override

详细说明

此 XML 读取器适用于广泛的应用场景。它能够解析格式正确的 XML,并可将元素的命名空间报告给内容处理程序;但它不解析任何外部实体。 出于历史原因,它不执行 XML 1.0 规范中描述的属性值规范化和行尾处理。

使用该类的最简单方法是创建一个读取器实例,定义一个输入源,指定读取器要使用的处理程序,然后解析数据。

例如,我们可以使用QFile 作为输入源。在此,我们创建一个Reader,并定义一个供其使用的输入源:

    QXmlSimpleReader xmlReader;
    QXmlInputSource *source = new QXmlInputSource(file);

处理程序允许我们在读取器遇到特定类型的内容时,或者在输入中发现错误时执行相应操作。必须告知读取器针对每种类型的事件应使用哪个处理程序。对于许多常见应用,我们可以通过继承 `QXmlDefaultHandler` 类来创建自定义处理程序,并使用它来处理错误和内容事件:

    Handler *handler = new Handler;
    xmlReader.setContentHandler(handler);
    xmlReader.setErrorHandler(handler);

如果你至少没有设置内容和错误处理程序,解析器将回退到其默认行为——即不执行任何操作。

处理输入的最便捷方式是使用parse()函数进行单次遍历读取,该函数的参数用于指定输入源:

    bool ok = xmlReader.parse(source);

    if (!ok)
        std::cout << "Parsing failed." << std::endl;

如果无法一次性解析整个输入(例如,输入量巨大,或者通过网络连接传输),可以将数据分批传入解析器。实现方法是让parse() 以增量方式工作,并后续调用parseContinue() 函数,直到所有数据都被处理完毕。

进行增量解析的一种常见方法是将network reply 的readyRead() 信号连接到一个插槽,并在该插槽中处理传入的数据。请参阅QNetworkAccessManager 。

可以通过setFeature() 和setProperty() 来调整解析行为的各个方面。

xmlReader.setFeature("http://xml.org/sax/features/namespace-prefixes", true);

QXmlSimpleReader 不是可重入的。若要在多线程代码中使用该类,请使用锁定机制(例如QMutex )对使用 QXmlSimpleReader 的代码进行锁定。

请注意,该类现已弃用,请使用QXmlStreamReader 或 QDomDocument 来读取 XML 文件。

成员函数文档

QXmlSimpleReader::QXmlSimpleReader()

构建一个简单的 XML 读取器。

[virtual noexcept] QXmlSimpleReader::~QXmlSimpleReader()

销毁简单的XML读取器。

[override virtual] QXmlDTDHandler *QXmlSimpleReader::DTDHandler() const

重新实现了:QXmlReader::DTDHandler() const。

另请参阅 setDTDHandler()。

[override virtual] QXmlContentHandler *QXmlSimpleReader::contentHandler() const

重新实现了:QXmlReader::contentHandler() const。

另请参见 setContentHandler()。

[override virtual] QXmlDeclHandler *QXmlSimpleReader::declHandler() const

重新实现了:QXmlReader::declHandler() const。

另请参阅 setDeclHandler()。

[override virtual] QXmlEntityResolver *QXmlSimpleReader::entityResolver() const

重新实现了:QXmlReader::entityResolver() const。

另请参阅 setEntityResolver()。

[override virtual] QXmlErrorHandler *QXmlSimpleReader::errorHandler() const

重新实现了:QXmlReader::errorHandler() const。

另请参阅 setErrorHandler()。

[override virtual] bool QXmlSimpleReader::feature(const QString &name, bool *ok = nullptr) const

重写了:QXmlReader::feature(const QString &name, bool *ok) const。

另请参阅 setFeature()。

[override virtual] bool QXmlSimpleReader::hasFeature(const QString &name) const

重新实现了:QXmlReader::hasFeature(const QString &name) const。

[override virtual] bool QXmlSimpleReader::hasProperty(const QString &name) const

重新实现了:QXmlReader::hasProperty(const QString &name) const。

[override virtual] QXmlLexicalHandler *QXmlSimpleReader::lexicalHandler() const

重新实现了:QXmlReader::lexicalHandler() const。

另请参阅 setLexicalHandler()。

[override virtual] bool QXmlSimpleReader::parse(const QXmlInputSource &input)

重写了:QXmlReader::parse(const QXmlInputSource &input)。

[override virtual] bool QXmlSimpleReader::parse(const QXmlInputSource *input)

重写:QXmlReader::parse(const QXmlInputSource *input)。

从input 读取一个XML文档,并一次性(非增量式)对其进行解析。如果解析成功,则返回true ;否则返回false 。

[virtual] bool QXmlSimpleReader::parse(const QXmlInputSource *input, bool incremental)

从input 读取XML文档并进行解析。如果解析成功,则返回true ;否则返回false ,表示发生错误。

如果incremental 为 false,当 XML 文件未完全读取完毕时,此函数将返回 false。在此情况下,无法继续解析。

如果incremental 为 true,当解析器在到达 XML 文件末尾之前就已到达input 的末尾时,解析器不会返回 false。相反,它会保存解析器的状态,以便在后续有更多数据可用时继续解析。 在这种情况下,您可以使用parseContinue()函数继续解析。该类存储了指向输入源input 的指针,而parseContinue()函数会尝试从该输入源读取数据。因此,在不再需要调用parseContinue()之前,请勿删除输入源input 。

如果在增量解析进行期间,将incremental 设置为true并调用此函数,则会启动一个新的解析会话,而之前的会话将被丢失。

另请参阅 parseContinue() 和QTcpSocket 。

[virtual] bool QXmlSimpleReader::parseContinue()

继续增量解析,从上次调用parse() 时指定的QXmlInputSource 获取输入。要使用此函数,必须先调用parse(),并将 incremental 参数设置为 true。

如果发生解析错误,则返回false ;否则返回true ,即使尚未到达XML文件的末尾。当有更多数据可供解析时,您可以再次调用此函数以在后续阶段继续解析。

当输入源中没有可用数据时调用此函数,将向解析器指示已到达 XML 文件的末尾。如果截至此处的输入格式不正确,则会发生解析错误,并返回 false。 如果提供的输入是结构良好的,则返回 `true`。以这种方式结束输入非常重要,因为这允许您重用该读取器来解析其他 XML 文件。

在到达文件末尾后调用此函数,但此时没有可用数据,无论之前的输入是否结构良好,都会返回 false。

另请参阅 parse()、QXmlInputSource::data() 和QXmlInputSource::next()。

[override virtual] void *QXmlSimpleReader::property(const QString &name, bool *ok = nullptr) const

重写了:QXmlReader::property(const QString &name, bool *ok) const。

另请参阅 setProperty()。

[override virtual] void QXmlSimpleReader::setContentHandler(QXmlContentHandler *handler)

重写了:QXmlReader::setContentHandler(QXmlContentHandler *handler)。

另请参阅 contentHandler()。

[override virtual] void QXmlSimpleReader::setDTDHandler(QXmlDTDHandler *handler)

重写了:QXmlReader::setDTDHandler(QXmlDTDHandler *handler)。

[override virtual] void QXmlSimpleReader::setDeclHandler(QXmlDeclHandler *handler)

重写了:QXmlReader::setDeclHandler(QXmlDeclHandler *handler)。

另请参阅 declHandler()。

[override virtual] void QXmlSimpleReader::setEntityResolver(QXmlEntityResolver *handler)

重写了:QXmlReader::setEntityResolver(QXmlEntityResolver *handler)。

另请参见 entityResolver()。

[override virtual] void QXmlSimpleReader::setErrorHandler(QXmlErrorHandler *handler)

重写:QXmlReader::setErrorHandler(QXmlErrorHandler *handler)。

另请参阅 errorHandler()。

[override virtual] void QXmlSimpleReader::setFeature(const QString &name, bool enable)

重写:QXmlReader::setFeature (const QString &name, bool value)。

如果 `enable ` 为真,则启用 `name ` 功能;否则将其禁用。

name 参数必须是以下字符串之一:

功能默认值备注
http://xml.org/sax/features/namespacestrue如果启用此选项,将向内容处理程序报告命名空间。
http://xml.org/sax/features/namespace-prefixesfalse如果启用此选项,将报告用于命名空间声明的原始带前缀的名称和属性。
http://qt-project.org/xml/features/report-whitespace-only-CharDatatrue若启用此选项,仅由空白字符组成的CharData将通过QXmlContentHandler::characters()进行报告。若禁用此选项,空白字符将被静默丢弃。
http://qt-project.org/xml/features/report-start-end-entityfalse若启用,解析器将报告 QXmlContentHandler::startEntity() 和 QXmlContentHandler::endEntity() 事件,因此字符数据可能会分块报告。若禁用,解析器不会报告这些事件,而是会静默地替换实体,并将字符数据作为一个整体报告。

另请参阅 feature() 和hasFeature()。

[override virtual] void QXmlSimpleReader::setLexicalHandler(QXmlLexicalHandler *handler)

重写了:QXmlReader::setLexicalHandler(QXmlLexicalHandler *handler)。

另请参阅 lexicalHandler()。

[override virtual] void QXmlSimpleReader::setProperty(const QString &name, void *value)

重写了:QXmlReader::setProperty (const QString &name, void *value)。

另请参阅 property()。

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