Создать QDomNode без QDomDocument

Можно ли создать QDomElement без наличия QDomDocument? Например, вот функция, которая должна построить дерево узлов под элементом parent:

void buildResponse (QDomDocument &doc, QDomElement &parent) {
    QDomElement child = doc.createElement("child");
    parent.appendChild(child);
}

Единственная причина, по которой я должен пройти doc использовать его как фабрику для создания элементов, под которыми функция добавляет parent, В приложении, над которым я сейчас работаю, было бы немного упростить мою реализацию, если бы мне не пришлось тащить QDomDocument вокруг.

Есть ли способ создать узлы без наличия документа?

2 ответа

Решение

Вы можете удалить документ как параметр, потому что у каждого QDomNode есть метод ownerDocument(), QDomElement наследуется QDomNode так что это также доступно из parent параметр. Проверьте документацию QDomNode.

Мне нужно было сделать что-то подобное в моем проекте, но у меня вообще не было доступа к родительскому документу. Я просто хотел вернуть QDomNode и добавить его в родительское дерево в вызывающем методе. Я переходил с libxml2, и изменение этого поведения потребовало значительного изменения кода. Таким образом, приведенное выше решение не сработало для меня.

Вместо этого я решил это, создав временный QDomDocument, а затем создал поддерево, используя его. Вернувшись к вызывающему методу, я импортировал его в родительский документ. Вот пример:

      #include <QtXml>
#include <iostream>

using namespace std;

QDomNode TestTree(void) {
    
    QDomDocument doc("testtree");
    QDomElement testtree=doc.createElement("testing");
    testtree.setAttribute("test","1");
    doc.appendChild(testtree);
    
    QDomElement testchild1 = doc.createElement("testje");
    testtree.appendChild(testchild1);
    
    QDomElement testchild2 = doc.createElement("testje");
    testtree.appendChild(testchild2);
    return testtree;
}

int main (int argc, char **argv) {
    
    QDomDocument doc("MyML");
    QDomElement root = doc.createElement("MyML");
    doc.appendChild(root);
    
    QDomElement tag = doc.createElement("Greeting");
    root.appendChild(tag);
    
    QDomText t = doc.createTextNode("Hello World");
    tag.appendChild(t);
    
    QDomNode testtree = TestTree();
    QDomNode testtree_copy=doc.importNode(testtree,true);
    root.appendChild(testtree_copy);
    
    QString xml = doc.toString();
    cout << qPrintable(xml) << endl;
    
    
}
Другие вопросы по тегам