Как сделать узел внутри узла, используя tinyxml2? - PullRequest
0 голосов
/ 02 сентября 2018
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 Ответ

0 голосов
/ 04 сентября 2018

Процесс создания узлов и подузлов 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 );

И, наконец, листья внутри Внутренняя головка и Внутренняя головка2 :

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>

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

...