2015-05-14 2 views
0

Я использую tinyxml.Deep Copy XML через TinyXML

Как дублировать или создавать копию существующего документа XMLDocument?

http://www.grinninglizard.com/tinyxmldocs/classTiXmlDocument.html#a4e8c1498a76dcde7191c683e1220882

Я пошел по этой ссылке, что говорит с помощью Clone повторить узел. Но это защищено, и я не хочу идти за выводом класса из этого и тому подобное.

Я также не хочу, чтобы сохранить существующий XMLDocument в файл, а затем сделать другим объектом XMLDocument, прочитать файл, чтобы иметь его копию.

Я также не могу выполнить глубокую копию, используя memcpy, потому что я не знаю о размере всего XML.

Я также не хочу, имеющий два объекта используется один за другим, как:

XMLDocumentObj1 = add_some_data 

XMLDocumentObj2 = add_the_same_data, and so on 

Основная причина, почему я хочу второй экземпляр является то, что первый может быть модифицирован различными разделами кода , в то время как одна и та же копия «читается» в нескольких местах. Мне нужно убедиться, что при чтении XMLDocument ошибок не возникает, потому что есть вероятность, что это может быть изменено в фоновом режиме с помощью потока, и я не получаю никаких сбоев в работе программы.

ответ

0

Я нашел это, и я думаю, что это может вам помочь.

https://github.com/leethomason/tinyxml2/blob/master/xmltest.cpp

const char* pub = "<?xml version='1.0'?> <element><sub/></element> <!--comment--> <!DOCTYPE>"; 
XMLDocument doc; 
doc.Parse(pub); 

XMLDocument clone; 
for(const XMLNode* node=doc.FirstChild(); node; node=node->NextSibling()) { 
    XMLNode* copy = node->ShallowClone(&clone); 
    clone.InsertEndChild(copy); 
} 

clone.Print(); 

int count=0; 
const XMLNode* a=clone.FirstChild(); 
const XMLNode* b=doc.FirstChild(); 
for(; a && b; a=a->NextSibling(), b=b->NextSibling()) { 
    ++count; 
    XMLTest("Clone and Equal", true, a->ShallowEqual(b)); 
} 
XMLTest("Clone and Equal", 4, count); 
+0

Обратите внимание, что ShallowClone (как следует из названия) только [Копирует сам узел] (http://www.grinninglizard.com/tinyxml2docs/classtinyxml2_1_1_x_m_l_comment.html#a47b3cdd2e1ad9735826e2d291d483e73), но не его дети. – starturtle

2

Вот то, что я написал, чтобы сделать глубокую копию. Он берет исходный узел и копирует его под узлом-получателем, дочерними и всеми. Память берется из контекста узла назначения. Надеюсь, это начало для вас в правильном направлении.

void CopyNode(tinyxml2::XMLNode *p_dest_parent, const tinyxml2::XMLNode *p_src) 
{ 
    // Protect from evil 
    if (p_dest_parent == NULL || p_src == NULL) 
    { 
     return; 
    } 

    // Get the document context where new memory will be allocated from 
    tinyxml2::XMLDocument *p_doc = p_dest_parent->GetDocument(); 

    // Make the copy 
    tinyxml2::XMLNode *p_copy = p_src->ShallowClone(p_doc); 
    if (p_copy == NULL) 
    { 
     // Error handling required (e.g. throw) 
     return; 
    } 

    // Add this child 
    p_dest_parent->InsertEndChild(p_copy); 

    // Add the grandkids 
    for (const tinyxml2::XMLNode *p_node = p_src->FirstChild(); p_node != NULL; p_node = p_node->NextSibling()) 
    { 
     CopyNode(p_copy, p_node); 
    } 
}