Как сделать узел внутри узла, используя 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, чего я хотел добиться, так это иметь узел внутри узла, как показано выше.

1 ответ

Процесс создания узлов и подузлов un tinyxml2 в значительной степени рекурсивный: то есть, когда вы создаете один, вы знаете, как создать оставшиеся.

Мой совет - просто следовать иерархии сверху вниз, пока не дойдете до листьев. Таким образом, вам нужно будет только использовать InsertEndChild (). Кроме того, вы должны использовать описательные имена для ваших узлов.

Разница лишь в том, что для создания корневого узла необходимо использовать XMLDoc.InsertEndChild (), в то время как в остальных случаях вы получаете указатель на узел, и поэтому вам нужно использовать стрелку для 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 );

Все идет нормально. Внутри "Головы" вам нужны две "Внутренние головы". Затем:

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

И, наконец, листья внутри inner-head и inner-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>

Надеюсь это поможет.

Другие вопросы по тегам