Создать 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;
}