2015-05-14 83 views
0

我正在使用tinyxml。通過TinyXML深層複製XML

如何複製或創建現有XMLDocument的副本?

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

我通過這個鏈接,說使用克隆複製一個節點去。但是這是受保護的,我不想因爲這個等而派生出一門課。

我也不想將現有的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(顧名思義)只[copys節點本身(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); 
    } 
}