QDomElement是否会因创建它的函数无效?

时间:2013-03-20 09:19:09

标签: c++ qt variables dom

我想像这样创建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的子节点是否有效?

2 个答案:

答案 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;
}