c++ - 如何使用 tinyxml2 在节点内创建节点?

标签 c++ xml tinyxml2

XMLDocument xmlDoc;

XMLNode * pRoot = xmlDoc.NewElement("Head");
xmlDoc.InsertFirstChild(pRoot);
XMLElement * pElement = xmlDoc.NewElement("Stat1");
pElement-> SetText(10);
pRoot->InsertEndChild(pElement);
pElement = xmlDoc.NewElement("Stat2");
pElement->SetText(0.5);
pRoot->InsertEndChild(pElement);

XMLNode *   pRoot2 = xmlDoc.NewElement("Head2");
xmlDoc.InsertAfterChild(pRoot, pRoot2);
XMLElement * pElement2 = xmlDoc.NewElement("Stat3");
pElement2-> SetText(10);
pRoot2->InsertEndChild(pElement2);

XMLError eResult = xmlDoc.SaveFile("SavedData.xml");
XMLCheckResult(eResult);

上面的代码将生成一个具有以下xml结构的xml文件

<Head>
  <Stat1>10</Stat1>
  <Stat2>0.5</Stat2>
 </Head>

<Head2>
  <Stat3>10</Stat3>
</Head2>

但我希望我的 xml 结构像

<root>
  <Head>
    <inner-Head>
      <Stat1>10</Stat1>
    </inner-Head>

    <inner-Head2>
      <Stat2>0.5</Stat2>
    </inner-Head2>
  </Head>

  <Head2>
    <Stat3>10</Stat3>
  </Head2>
</root>

我是 tinyxml2 的新手,找不到任何 tinyxml2 教程,我想实现的是在节点内有一个节点,如上所示。

最佳答案

在 tinyxml2 中创建节点和子节点的过程几乎是递归的:即,一旦你创建了一个,你就知道如何创建其余的。

我的建议是从上到下遵循层次结构,直到到达叶子。这样您只需要使用 InsertEndChild()。此外,您应该为节点使用描述性名称。

唯一的区别是,要创建根节点,您必须使用 XMLDocInsertEndChild(),而在其余情况下,您会收到一个指向该节点的指针,因此您必须对 XMLNode 使用箭头。InsertEndChild()

您想在文档中有一个“根”节点。然后:

XMLDocument xmlDoc;

XMLNode * nRoot = xmlDoc.NewElement( "root" );
xmlDoc.InsertEndChild( nRoot );

然后你想有“头”的,卡在根上。所以:

XMLNode * nHead = xmlDoc.NewElement( "Head" );
XMLNode * nHead2 = xmlDoc.NewElement( "Head2" );
nRoot->InsertEndChild( nHead );
nRoot->InsertEndChild( nHead2 );

到目前为止一切顺利。在“Head”里面,你想要两个“inner-Heads”。然后:

XMLNode * nInnerHead = xmlDoc.NewElement( "inner-Head" );
XMLNode * nInnerHead2 = xmlDoc.NewElement( "inner-Head2" );
nHead->InsertEndChild( nInnerHead );
nHead->InsertEndChild( nInnerHead2 );

最后,inner-Headinner-Head2 中的叶子:

XMLElement * pElement = xmlDoc.NewElement( "Stat1" );
pElement-> SetText( 10 );    
nInnerHead->InsertEndChild( pElement );

pElement = xmlDoc.NewElement( "Stat2" );
pElement->SetText( 0.5 );
nInnerHead2->InsertEndChild( pElement );

Head2 中的另一个分支更简单,因为它只挂了一片叶子:

pElement = xmlDoc.NewElement( "Stat3" );
pElement->SetText( 10 );
nHead2->InsertEndChild( pElement );

你得到了想要的结果:

<root>
<Head>
    <inner-Head>
        <Stat1>10</Stat1>
    </inner-Head>
    <inner-Head2>
        <Stat2>0.5</Stat2>
    </inner-Head2>
</Head>
<Head2>
    <Stat3>10</Stat3>
</Head2>
</root>

希望这对您有所帮助。

关于c++ - 如何使用 tinyxml2 在节点内创建节点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52133941/

相关文章:

python - 类似于 simplejson/json 的 XML 库? - Python

发布大数据时出现 Java IOException "Unexpected end of file from server"

c++ - TinyXML2/C++ - 插入一个元素

c++ - 在 C++ 中使用 tinyxml2 读取 xml 文件

c++ - 处理中断时如何返回主 GUI 线程?

循环缓冲区的 C++ 自定义迭代器,如何实现 end()?

c# - 将 XElement 转换为不带 JSON 的 JObject - 或 - 为空元素配置 SerializeXNode

c++ - 为什么 TinyXML2 的 XMLDocument::FirstChild() 函数在尝试解析这个有效的 XML 文件时返回 NULL?

c++ - std::mutex 和 std::shared_mutex 的区别

c++ - 从对其他进程(如 cmds)可见的 C++ 代码设置当前用户环境变量