我之前质疑过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段的字符串。 我需要PARING STRING得到一个表示xml的DOM对象并附加到另一棵树的节点上。 最重要的是我在里面有xml的字符串......我无法绕过这个重要的要求。从一个字符串,得到dom并附上它。 这似乎是不可能的......可能吗?
我该怎么做? 我真的不能接受这样一个事实:Xerces-C程序员从来没有想过这样的场景,也没有提供合理的功能来实现这样的解决方案。
即使我告诉我是否有一种方法可以改变节点或元素的节点所有权,也许就足够了。你看,有一个WRONG_DOCUMENT_ERR,当我以前尝试过时,会引发它。好吧,如果图书馆提供了一种更改节点所有权以便它属于另一个文档的方法,那我就没事了,我的问题就解决了!
三江源
答案 0 :(得分:1)
DOMDocument::importNode是DOM Level 2 function,旨在解决这个问题:
DOMElement * el1Imported = doc2->importNode(el1, true);
el2->appendChild(el1Imported); // element is now in right document