我想像这样创建QDomElement
:
class DomParser : public QObject
{
public:
DomParser();
QDomDocument doc;
QDomElement* root;
}
QDomElement* DomParser::domParameterStatus(UniversalMessage* parameterStatus)
{
root = &(doc.createElement("doc"));
QDomText latin = doc.createTextNode("Ars longa vita brevis");
QDomText english = doc.createTextNode("Art is long, life is short");
doc.appendChild(root);
root.appendChild(quote);
root.appendChild(translation);
...
return root;
}
我在类DomParser中创建root只是为了保存dom树结构,但root的子节点是否有效?
答案 0 :(得分:1)
是的,只要doc没有被销毁。来自documentation:
由于元素,文本节点,注释,处理指令等不能存在于文档的上下文之外,因此文档类还包含创建这些对象所需的工厂函数。创建的节点对象具有ownerDocument()函数,该函数将它们与创建它们的上下文中的文档相关联。最常用的DOM类是QDomNode,QDomDocument,QDomElement和QDomText。
解析的XML在内部由对象树表示,可以使用各种QDom类进行访问。所有QDom类仅引用内部树中的对象。一旦最后一个QDom对象引用它们并且删除了QDomDocument本身,DOM树中的内部对象就会被删除。
此外,appendChild会重新启动子节点,因此只要root是他们的父节点并且存在,它们就不会去任何地方。
答案 1 :(得分:0)
回答你的问题:是的,所有元素一旦被添加到父节点,只要它们的父节点存在就会继续有效。
此处的代码不正确,无法编译。这一行:root = &(doc.createElement("doc"));
正在尝试创建一个指向临时变量的指针。这不仅是一个非常糟糕的主意,导致几乎肯定的崩溃,它根本不是必需的。 QDom旨在完全基于价值,您根本不需要使用指针。这是您的方法的固定版本:
QDomElement DomParser::domParameterStatus(UniversalMessage* parameterStatus)
{
root = doc.createElement("doc");
QDomText latin = doc.createTextNode("Ars longa vita brevis");
QDomText english = doc.createTextNode("Art is long, life is short");
doc.appendChild(root);
root.appendChild(quote);
root.appendChild(translation);
...
return root;
}