Потоки XMLНачиная с 4.3, Qt вводит два новых класса для чтения и записи XML: QXmlStreamReader и QXmlStreamWriter. QXmlStreamReader и QXmlStreamWriter - два новых класса, реализованных в Qt 4.3 и выше. Поток чтения представляет XML документ как поток меток (или символов - tokens). Это отличается от 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; } |
Попытка перевода Qt документации. Если есть желание присоединиться, или если есть замечания или пожелания, то заходите на форум: Перевод Qt документации на русский язык... Люди внесшие вклад в перевод: Команда переводчиков |