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

dom ツリー構造体を保存するためだけにクラス DomParser のメンバーとして root を作成しますが、 root の子は関数から有効になりますか?

4

2 に答える 2

1

はい、ドキュメントが破棄されない限り。ドキュメントから:

要素、テキスト ノード、コメント、処理命令などはドキュメントのコンテキスト外には存在できないため、ドキュメント クラスにはこれらのオブジェクトの作成に必要なファクトリ関数も含まれています。作成されたノード オブジェクトには、それらが作成されたコンテキスト内のドキュメントに関連付ける ownerDocument() 関数があります。最も頻繁に使用される DOM クラスは、QDomNode、QDomDocument、QDomElement、および QDomText です。

解析された XML は、さまざまな QDom クラスを使用してアクセスできるオブジェクトのツリーによって内部的に表されます。すべての QDom クラスは、内部ツリー内のオブジェクトのみを参照します。DOM ツリーの内部オブジェクトは、それらを参照している最後の QDom オブジェクトと QDomDocument 自体が削除されると削除されます。

また、appendChild は子ノードの親を変更するため、ルートが親であり存在する限り、子ノードはどこにも行きません。

于 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 に答える