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的字符串......我不能绕过这个重要的要求。从一个字符串中,获取 dom 并附加它。这似乎是不可能的事情……可能吗?

我怎样才能做到这一点???我真的不能接受 Xerces-C 程序员从来没有想到过这样的场景并且没有提供合理的功能来实现这样的解决方案的事实。

即使我可以告诉我是否有一种方法可以改变节点或元素的节点所有权,也许就足够了。您会看到,执行我之前尝试过的操作时会引发 WRONG_DOCUMENT_ERR。好吧,如果库提供了一种方法来更改节点的所有权,使其属于另一个文档,那我就没事了,我的问题就解决了!

谢谢

4

1 回答 1

3

DOMDocument::importNode是一个DOM Level 2 函数,旨在解决这个确切的问题:

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