Spec-Zone.ru › Qt 5.14

Потоковая передача XML

Начиная с версии 4.3, Qt предоставляет два новых класса для чтения и записи XML: QXmlStreamReader и QXmlStreamWriter.

Классы QXmlStreamReader и QXmlStreamWriter — это два новых класса, предоставленных в Qt 4.3 и более поздних версиях. Потоковый читатель сообщает об XML-документе как о потоке маркеров. Это отличается от SAX, так как приложения SAX предоставляют обработчики для получения XML-событий от анализатора, в то время как QXmlStreamReader управляет циклом, извлекая маркеры из читателя по мере необходимости. Такой подход позволяет создавать парсеры рекурсивного спуска, что позволяет разделить код парсинга XML на различные методы или классы.

QXmlStreamReader — это корректный XML 1.0 парсер, который исключает внешние анализируемые сущности. Следовательно, данные, предоставляемые потоковым читателем, соответствуют критериям W3C для корректного XML, до тех пор, пока не произойдет ошибка. В противном случае можно использовать функции, такие как atEnd(), error() и hasError(), чтобы проверить и просмотреть ошибки.

Пример реализации QXmlStreamReader представлен в XbelReader в примере QXmlStream Bookmarks, который оборачивает QXmlStreamReader. Конструктор принимает treeWidget в качестве параметра, и класс имеет специфичные для Xbel функции:

    XbelReader(QTreeWidget *treeWidget);
    ...
    void readXBEL();
    void readTitle(QTreeWidgetItem *item);
    void readSeparator(QTreeWidgetItem *item);
    void readFolder(QTreeWidgetItem *item);
    void readBookmark(QTreeWidgetItem *item);

    QTreeWidgetItem *createChildItem(QTreeWidgetItem *item);

    QXmlStreamReader xml;
    QTreeWidget *treeWidget;
    ...

Функция read() принимает QIODevice и устанавливает его с помощью setDevice(). Функция raiseError() используется для отображения пользовательского сообщения об ошибке, указывающего, что версия файла неверна.

bool XbelReader::read(QIODevice *device)
{
    xml.setDevice(device);

    if (xml.readNextStartElement()) {
        if (xml.name() == QLatin1String("xbel")
            && xml.attributes().value(versionAttribute()) == QLatin1String("1.0")) {
            readXBEL();
        } else {
            xml.raiseError(QObject::tr("The file is not an XBEL version 1.0 file."));
        }
    }

    return !xml.error();
}

Дополнительным классом к QXmlStreamReader является QXmlStreamWriter, который предоставляет XML-писатель с простым потоковым API. QXmlStreamWriter работает с QIODevice и имеет специализированные функции для всех XML-маркеров или событий, которые вы хотите записать, такие как writeDTD(), writeCharacters(), writeComment() и так далее.

Для записи XML-документа с помощью QXmlStreamWriter, вы начинаете документ с помощью функции writeStartDocument() и заканчиваете её с помощью writeEndDocument(), которая неявно закрывает все оставшиеся открытые теги. Теги элементов открываются с помощью writeStartDocument() и следуют за writeAttribute() или writeAttributes(), содержимым элемента и затем writeEndDocument(). Также можно использовать writeEmptyElement() для записи пустых элементов.

Содержимое элемента состоит из символов, ссылок на сущности или вложенных элементов. Содержимое можно записать с помощью writeCharacters(), функция, которая также обрабатывает экранирование всех запрещённых символов и последовательностей символов, writeEntityReference() или последующих вызовов writeStartElement().

Класс XbelWriter из примера QXmlStream Bookmarks оборачивает QXmlStreamWriter. Его функция writeFile() иллюстрирует основные функции QXmlStreamWriter, упомянутые выше:

bool XbelWriter::writeFile(QIODevice *device)
{
    xml.setDevice(device);

    xml.writeStartDocument();
    xml.writeDTD(QStringLiteral("<!DOCTYPE xbel>"));
    xml.writeStartElement(QStringLiteral("xbel"));
    xml.writeAttribute(XbelReader::versionAttribute(), QStringLiteral("1.0"));
    for (int i = 0; i < treeWidget->topLevelItemCount(); ++i)
        writeItem(treeWidget->topLevelItem(i));

    xml.writeEndDocument();
    return true;
}

© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-5.14/xml-streaming.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API