1

以前、RapidXml での同様の問題について質問しましたが、今は同じですが、Xerces-C を使用していることを知りたいです。

私は、xml を解析する必要がある C++ アプリケーションに取り組んでいます。

次の点を考慮してください。

xml ファイル: file1.xml

<root>
   <node1>value1</node1>
   <node2>value2</node2>
</root>

xml ファイル: file2.xml

<anotherroot>
   <anothernode1>anothervalue1</anothernode1>
   <anothernode2>anothervalue2</anothernode2>
</anotherroot>

私のcppファイル

using namespace xercesc;
// First tree
XercesDOMParser* parser1 = new XercesDOMParser();
parser1->parse("file1.xml"); // Loading xml and building tree (XercesDOMParser owns the document)
DOMDocument* doc1 = parser1->getDocument();
DOMElement* el1 = doc1->getDocumentElement(); // Getting root
// Second tree
XercesDOMParser* parser2 = new XercesDOMParser();
parser2->parse("file2.xml"); // Loading xml and building tree (XercesDOMParser owns the document)
DOMDocument* doc2 = parser2->getDocument();
DOMElement* el2 = doc2->getDocumentElement(); // Getting root

私はこれをしたいと思います:

el2->appendChild(el1);

したがって、ドキュメント doc2 の最終的な xml は

<anotherroot>
   <anothernode1>anothervalue1</anothernode1>
   <anothernode2>anothervalue2</anothernode2>
   <root>
      <node1>value1</node1>
      <node2>value2</node2>
   </root>
</anotherroot>

しかし、そうすると次のようになります。

「xercesc_3_1::DOMException」のインスタンスをスローした後に呼び出された終了が中止されました

アタッチしたい要素が別のツリーに属しているためだと思います。どうすればこの結果を達成できますか? 問題は、基本的に、xml セグメントを含むツリーと文字列があることです。その xml を表す DOM オブジェクトを取得し、他のツリーのノードにアタッチする必要があります。最も重要なことは、内部に xml を含む文字列があることです... この重要な要件を回避することはできません。ひもから、ドムをとって取り付けます。それは不可能のようです...可能ですか?

これどうやってするの???Xerces-C プログラマーがそのようなシナリオをまったく考えておらず、そのようなソリューションを実現するための適切な機能を提供していなかったという事実を、私は本当に受け入れることができません。

ノードまたは要素のノード所有権を変更する方法があるかどうかを教えてもらえたとしても、それで十分かもしれません。ほら、以前に試したことが実行されたときに発生する WRONG_DOCUMENT_ERR があります。ライブラリがノードの所有権を別のドキュメントに属するように変更する方法を提供した場合、私は大丈夫で、私の問題は解決されるでしょう!

ありがとうございました

4

1 に答える 1

3

DOMDocument::importNodeは、まさにこの問題を解決するために設計されたDOM レベル 2 関数です。

DOMElement * el1Imported = doc2->importNode(el1, true);
el2->appendChild(el1Imported); // element is now in right document
于 2011-01-15T14:06:47.177 に答える