Создание и запись XML-документа


Оглавление

При создании XML-документа необходимо иметь в своем распоряжении механизм создания элементов. Для этого класс QDomDocument содержит серию методов: например, createElement(), createTextNode(), createAttribute().

Каждый из этих методов возвращает объект узла. Программа, приведенная в листинге, демонстрирует процесс создания XML-документа.


int main()
{
    QDomDocument doc("addressbook");
    QDomElement  domElement = doc.createElement("adressbook");
    doc.appendChild(domElement);

    QDomElement contact1 = 
        contact(doc, "Piggy", "+49 631322187", "piggy@mega.de");

    QDomElement contact2 = 
        contact(doc, "Kermit", "+49 631322181", "kermit@mega.de");

    QDomElement contact3 = 
        contact(doc, "Gonzo", "+49 631322186", "gonzo@mega.de");

    domElement.appendChild(contact1);
    domElement.appendChild(contact2);
    domElement.appendChild(contact3);

    QFile file("adressbook.xml");
    if(file.open(QIODevice::WriteOnly)) {
        QTextStream(&file) << doc.toString();
        file.close();
    }
    return 0;
}

После создания объекта класса QDomDocument необходимо создать начальный элемент, который представляет собой начальный узел создаваемой иерархии. В нашем случае этот элемент имеет имя addressbook. Вызов метода appendChild() добавляет созданный элемент. Вызов функции contact() создает элемент, содержащий контактную информацию. Эти элементы добавляются методом appendChild() в начальный элемент документа domElement. Для записи XML-документа в файл необходимо вызвать метод toString(), который возвратит текстовое представление XML-документа, и после этого произвести запись в файл.


QDomElement contact(      QDomDocument& domDoc, 
                    const QString&      strName, 
                    const QString&      strPhone,
                    const QString&      strEmail
                   )
{
    static int nNumber = 1;

    QDomElement domElement = makeElement(domDoc, 
                                         "contact", 
                                         QString().setNum(nNumber)
                                        );
    domElement.appendChild(makeElement(domDoc, "name", "", strName));
    domElement.appendChild(makeElement(domDoc, "phone", "", strPhone));
    domElement.appendChild(makeElement(domDoc, "email", "", strEmail));

    nNumber++;

    return domElement;
}

Функция contact() содержит статическую переменную, увеличивающую свое значение после каждого вызова функции. Это необходимо для присвоения контактным адресам определенного номера. Из этой функции производится вызов функции makeElement() для создания элементов, представляющих собой составные части контактного адреса.


QDomElement makeElement(      QDomDocument& domDoc, 
                        const QString&      strName,
                        const QString&      strAttr = QString::null,
                        const QString&      strText = QString::null
                       )
{
    QDomElement domElement = domDoc.createElement(strName);

    if (!strAttr.isEmpty()) {
        QDomAttr domAttr = domDoc.createAttribute("number");
        domAttr.setValue(strAttr);
        domElement.setAttributeNode(domAttr);
    }

    if (!strText.isEmpty()) {
        QDomText domText = domDoc.createTextNode(strText);
        domElement.appendChild(domText);
    }
    return domElement;
}

В функции makeElement() производится создание элемента с помощью метода createElement() объекта класса QDomDocument. Если третьим параметром было передано значение атрибута, то к элементу будет добавлен атрибут number. Его создание производится вызовом метода createAttribute() объекта класса QDomDocument. Вызов метода setValue() присвоит этому атрибуту переданное в метод значение. Если в четвертом параметре функции была передана строка текста, то методом createTextNode() объекта класса QDomNode будет создан текстовый узел. Вызов метода appendChild() внесет текстовую информацию в объект элемента.

Читать далее: Работа с SAX