1

我想这样创建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;
}

我将 root 设置为 DomParser 类中的成员只是为了保存 dom 树结构,但 root 的子级在函数之外是否有效?

4

2 回答 2

1

是的,只要 doc 没有被破坏。从文档中:

由于元素、文本节点、注释、处理指令等不能存在于文档的上下文之外,因此文档类还包含创建这些对象所需的工厂函数。创建的节点对象有一个 ownerDocument() 函数,该函数将它们与在其上下文中创建它们的文档相关联。最常使用的 DOM 类是 QDomNode、QDomDocument、QDomElement 和 QDomText。

解析的 XML 在内部由可以使用各种 QDom 类访问的对象树表示。所有 QDom 类只引用内部树中的对象。一旦最后一个引用它们的 QDom 对象和 QDomDocument 本身被删除,DOM 树中的内部对象将被删除。

此外, appendChild 将子节点重新设置为父节点,因此只要 root 是它们的父节点并且存在,它们就不会去任何地方。

于 2013-03-20T10:21:46.393 回答
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;
}
于 2013-03-20T10:21:56.033 回答