Spec-Zone.ru › Qt 5.6

Потоковая обработка 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() == "xbel" && xml.attributes().value("version") == "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("<!DOCTYPE xbel>");
    xml.writeStartElement("xbel");
    xml.writeAttribute("version", "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/archives/qt-5.6/xml-streaming.html

Spec-Zone.ru

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