Чтение XML-документа
Оглавление
- Работа с XML
- XML и Qt
- Работа с DOM
- Чтение XML-документа
- Создание и запись XML-документа
- Работа с SAX
Класс QDomElement создан для представления элементов. Иерархия DOM содержит узлы различного типа. Например, узел элемента соответствует открытому и закрытому тегу. Данные, находящиеся между этими тегами, представляют собой узлы потомков типа "элемент". Все узлы иерархии DOM являются объектами класса QDomNode, которые способны содержать в себе любые типы узлов. Для проведения операций над узлом его, прежде всего, необходимо преобразовать к нужному типу. Для преобразования объектов QDomNode в QDomElement следует воспользоваться методом QDomNode::toElement(). Нужно всегда проверять возвращаемое этим методом значение, ведь в случае ошибки будет возвращено нулевое значение, которое можно проверить методом isNull().
{рисунок}
Пример программы осуществляет чтение XML-документа и выводит его данные на экран в следующем виде:
TEMPLATE = app
QT += xml
SOURCES = main.cpp
win32:CONFIG += console
win32:TARGET = ../XmlDOMRead
Для поддержки XML Qt предоставляет отдельный модуль, для включения которого его нужно указать в секции qt pro-файла. Обратите внимание на секцию config, в которой добавилось значение console. Это нужно для того, чтобы приложение могло осуществлять вывод на консоль в ОС Windows.
#include <QtXml>
void traverseNode(const QDomNode& node)
{
QDomNode domNode = node.firstChild();
while(!domNode.isNull()) {
if(domNode.isElement()) {
QDomElement domElement = domNode.toElement();
if(!domElement.isNull()) {
if(domElement.tagName() == "contact") {
qDebug() << "Attr: "
<< domElement.attribute("number", "");
}
else {
qDebug() << "TagName: " << domElement.tagName()
<< "\tText: " << domElement.text();
}
}
}
traverseNode(domNode);
domNode = domNode.nextSibling();
}
}
int main()
{
QDomDocument domDoc;
QFile file("addressbook.xml");
if(file.open(QIODevice::ReadOnly)) {
if(domDoc.setContent(&file)) {
QDomElement domElement= domDoc.documentElement();
traverseNode(domElement);
}
file.close();
}
return 0;
}
В функции main() создаются объекты классов QDomDocument и QFile. Объект класса QDomDocument представляет собой XML-документ. Для считывания XML-документа в метод setContext() объекта класса QDomDocument необходимо передать объект, произведенный от класса, унаследованного от QIODevice. В данном случае это класс QFile.
Далее, для получения объекта класса QDomElement производится вызов метода documentElement() объекта класса QDomDocument. Полученный объект передается в функцию traverseNode(), которая обеспечивает прохождение по всем элементам XML-документа.
Для прохождения по иерархии DOM удобно применить рекурсию. Из рекурсивной функции traverseNode() вызываются методы firstChild() и nextSibling() объекта класса QDomNode. Ели метод nextSibling() возвращает нулевое значение, то это значит, что узлов больше нет. Все получаемые узлы проверяются в цикле с помощью метода isElement(). В том случае, если полученный узел является элементом, производится преобразование его к типу QDomElement, с помощью метода toElement(), с последующим присвоением результата объекту класса QDomEiement. При обнаружении элемента с именем "contact", с помощью метода attribute() производится отображение значения его атрибута number. В остальных случаях вызываются методы tagName() и text() для отображения имени и данных элемента.
Читать далее: Создание и запись XML-документа