Класс QXmlSimpleReader
Класс QXmlSimpleReader предоставляет реализацию простого парсера XML. Подробнее...
| Заголовок: | #include <QXmlSimpleReader> |
| CMake: | find_package(Qt6 COMPONENTS Core5Compat REQUIRED) 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 для предоставления входных данных. Здесь мы создаём парсер и определяем источник ввода, который будет использоваться парсером:
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(), пока все данные не будут обработаны.
Распространённый способ выполнения инкрементального парсинга — подключить сигнал readyRead() сетевого ответа к слоту и обработать входящие данные там. См. QNetworkAccessManager.
Аспекты поведения парсинга можно адаптировать, используя setFeature() и setProperty().
xmlReader.setFeature("http://xml.org/sax/features/namespace-prefixes", true); QXmlSimpleReader не является реентерабельным. Если вы хотите использовать класс в потоковом коде, заблокируйте код с помощью QXmlSimpleReader с помощью механизма блокировки, такого как QMutex.
Обратите внимание, что этот класс теперь устарел, используйте QXmlStreamReader или QDomDocument для чтения XML-файлов.
Документация по функциям-членам
QXmlSimpleReader::QXmlSimpleReader()
Создаёт простой парсер XML.
[virtual] 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)
Считывает XML-документ из input и анализирует его в одном проходе (не инкрементально). Возвращает true если анализ завершился успешно; в противном случае возвращает false.
[virtual] bool QXmlSimpleReader::parse(const QXmlInputSource *input, bool incremental)
Считывает XML-документ из input и анализирует его. Возвращает true если анализ завершился успешно; в противном случае возвращает false, указывая на ошибку.
Если incremental ложно, эта функция вернёт false, если XML-файл не был полностью прочитан. В этом случае анализ нельзя продолжить.
Если incremental истинно, анализатор не возвращает false, если достигнет конца input до достижения конца XML-файла. Вместо этого он сохраняет состояние анализатора, чтобы анализ можно было продолжить позже, когда доступны дополнительные данные. В этом случае вы можете использовать функцию parseContinue() для продолжения анализа. Этот класс хранит указатель на источник ввода input, а функция parseContinue() пытается прочитать из этого источника ввода. Поэтому вы не должны удалять источник ввода input, пока вам больше не нужно вызывать parseContinue().
Если эта функция вызывается с incremental, установленным в true, в то время как инкрементальный анализ уже в процессе, будет начата новая сессия анализа, и предыдущая сессия будет потеряна.
См. также parseContinue() и QTcpSocket.
[virtual] bool QXmlSimpleReader::parseContinue()
Продолжает инкрементальный анализ, используя входные данные из QXmlInputSource, указанного в последнем вызове parse(). Чтобы использовать эту функцию, вы обязательно должны вызвать 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).
Включает функцию name, если enable истинно; иначе выключает.
Параметр name должен быть одним из следующих строк:
| Функция | Значение по умолчанию | Примечания |
|---|---|---|
| http://xml.org/sax/features/namespaces | true | Если включено, пространства имён сообщаются обработчику содержимого. |
| http://xml.org/sax/features/namespace-prefixes | false | Если включено, исходные префиксные имена и атрибуты, используемые для объявлений пространств имён, сообщаются. |
| http://qt-project.org/xml/features/report-whitespace-only-CharData | true | Если включено, CharData, состоящие только из пробельных символов, сообщаются с помощью QXmlContentHandler::characters(). Если отключено, пробелы игнорируются. |
| http://qt-project.org/xml/features/report-start-end-entity | false | Если включено, анализатор сообщает события 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().
© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-6.1/qxmlsimplereader.html