【问题标题】:Why can't I copy the contents of an XMLDocument to another XMLDocument using TinyXml2?为什么我不能使用 TinyXml2 将 XMLDocument 的内容复制到另一个 XMLDocument?
【发布时间】:2015-12-17 14:24:05
【问题描述】:

我不明白为什么下面的代码不能按预期将一个元素从 doc1 复制到 doc2:

void test_xml(){
using namespace tinyxml2;
XMLDocument doc1, doc2;
XMLPrinter printer;

doc1.LoadFile("./res/xml/basic.xml");
if(doc1.Error())
    std::cout << doc1.ErrorName();
doc1.Print(&printer);
std::cout << printer.CStr(); // prints "</atag>" without quotes
printer.ClearBuffer();

doc2.InsertFirstChild(doc1.RootElement());
if(doc2.Error())
    std::cout << doc2.ErrorName(); // doesn't run, there's no error
doc2.Print(&printer);
std::cout << printer.CStr(); // prints nothing, no child got inserted to doc2
std::cout << doc2.NoChildren(); //prints "1" meaning we didn't insert anything
}

有人能指出如何改进吗?

【问题讨论】:

    标签: c++ xml-parsing tinyxml2


    【解决方案1】:

    来自 TinyXml2 文档:

    InsertFirstChild ... 如果节点不属于同一个文档,则返回 addThis 参数或 0。

    基本上,如果节点是由该文档制造的(NewElementNewText 等),您只能将节点添加到该文档。

    您必须通过doc1 来创建相应的节点(使用ShallowClone,并将它们添加到doc2。似乎没有DeepClone 可以为您完成这一切。

    http://sourceforge.net/p/tinyxml/discussion/42748/thread/820b0377/,“practicevoodoo”建议:

    XMLNode *deepCopy( XMLNode *src, XMLDocument *destDoc )
    {
        XMLNode *current = src->ShallowClone( destDoc );
        for( XMLNode *child=src->FirstChild(); child; child=child->NextSibling() )
        {
            current->InsertEndChild( deepCopy( child, destDoc ) );
        }
    
        return current;
    }
    

    【讨论】:

    • 我只想“连接”,而不是插入东西。有没有办法将两个文档中的 XML CStr()s 放在一起,然后让第三个文档解析结果而不保存到首先是一个文件?
    • “连接”是什么意思?如果将两个 XML 文件连接为文本,则结果不是有效的 XML(它有两个顶级元素)。
    猜你喜欢
    • 1970-01-01
    • 2011-01-26
    • 2012-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-02
    • 1970-01-01
    • 2020-10-24
    相关资源
    最近更新 更多