Как l oop n раз, один уровень на l oop в файле xml - PullRequest
0 голосов
/ 13 января 2020

Это то, что я чувствую, должно быть легко, но после многих часов я все еще не могу понять это. Я попытался найти его в Google, но, похоже, мой мозг хочет задать вопрос только в трех строчках объяснения, что на самом деле не работает с Google. Не стесняйтесь редактировать, если у вас есть лучший способ сформулировать это.

У меня есть файл xml, скажите это:

<tag1>
    <tag2>
        <tag3>
            ...
        </tag3>
    </tag2>
</tag1>

В документе может быть много тегов tag1, tag2 и tag3 на каждого родителя.

Используя pugi xml для c ++, я хочу выполнить действие на выбранном узле. Вот псевдокод того, что я хотел бы выполнить sh, но я знаю, что это неправильно и не совсем выполнимо.

for(pugi::xml_node tag1 : doc->child("tag1").children()){
   //Do something with tag1
   for(pugi::xml_node tag2 : doc->child("tag1").child("tag2").children()){
       //Do something with tag2
       for(pugi::xml_node tag3 : doc->child("tag1").child("tag2").child("tag3").children()){
            //Do something with tag3
       }
   }

}

Просто посмотрите на это , довольно просто найти то, что не будет работать ... Мне нужно иметь возможность взаимодействовать с do c .child (). child (). child (). child () ..... внутри л oop. Необходимость добавления .child () для каждой итерации не позволяет мне делать что-то рекурсивное, такое как:

void loopXNestedTimes(int n){

   if(n==0) return;
   // Do my stuff
   loopXNestedTimes(n-1);
}

Любая подсказка, как бы я go об этом? Я использую Qt и c ++, но все еще изучаю оба, так что, возможно, мне не хватает языковых возможностей, которые позволяют это.

1 Ответ

2 голосов
/ 13 января 2020

Используйте tag1, чтобы получить tag2 элементов (а не doc), и используйте tag2, чтобы получить tag3 элементов, что, я думаю, является критической точкой, которую вы упускаете.

Ваш фрагмент кода должен выглядеть следующим образом:

for (pugi::xml_node tag1 : doc->child("tag1").children()){
   //Do something with tag1
   for (pugi::xml_node tag2 : tag1.child("tag2").children()){
       //Do something with tag2
       for (pugi::xml_node tag3 : tag2.child("tag3").children()){
            //Do something with tag3
       }
   }
}
...