2011-01-14 5 views
0

Я допросил ранее о подобной проблеме в RapidXml, я хочу знать, теперь, то же самое, но с использованием Xerces-C.Присоединение DEROM Xerces-C из DOMDocument Xerces-C к другому

Я работаю над приложением на C++, которое должно анализировать xml.

Рассмотрим следующий пример:

XML файл: file1.xml

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

XML файл: file2.xml

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

мой каст файл

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

Так что окончательный XML в документе doc2 является

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

Но, делая так, я получаю:

Terminate вызывается после выбрасывания экземпляр «xercesc_3_1 :: DOMException 'Aborted

Я думаю, потому что элемент, который я хочу прикрепить, принадлежит другому дереву. Как я могу достичь этого результата? Проблема в том, что у меня есть дерево и строка, содержащая xml-сегмент. Мне нужно, чтобы PARSE STRING получил объект DOM, представляющий этот xml и прикрепленный к узлу другого дерева. Самое главное, что у меня есть строка с xml внутри ... Я не могу обойти это важное требование. Из строки, получая дом и прикрепляя его. Кажется, что-то невозможное ... возможно?

Как я могу это сделать ??? Я действительно не могу согласиться с тем, что программисты Xerces-C так и не поняли такой сценарий и не обеспечили разумную функциональность для достижения такого решения.

Возможно, этого было бы достаточно, даже если я скажу мне, есть ли способ ИЗМЕНЕНИЯ СОБСТВЕННОГО УНИЖАЮЩЕГО УНИВЕРСИТЕТА или узла. Видите ли, существует WRONG_DOCUMENT_ERR, который возникает, когда выполняется то, что я пробовал раньше. Ну, если библиотека предоставила возможность изменить право собственности на узел, чтобы он принадлежал другому документу, я был бы в порядке, и моя проблема была бы решена!

Thankyou

ответ

1

DOMDocument::importNode является DOM Level 2 function, который был разработан, чтобы решить эту проблему точно:

DOMElement * el1Imported = doc2->importNode(el1, true); 
el2->appendChild(el1Imported); // element is now in right document 
+0

у вас есть хороший СРОКИ Брэдли. :) Я роумировал в доке Xerces и нашел этот метод:) ... посмотрим, работает ли он :) – Andry

+0

РАБОТЫ отлично ... ну, я нашел решение первым, но вы были очень добры, чтобы ответить мне ... никто не делал :(спасибо ... Вы заслуживаете правильного ответа :) – Andry