Чтение XML-документа


Класс 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-документа