Разбор XML с помощью PugiXML, бесконечный цикл

это почти первая программа на C++, которую я когда-либо делал, она должна отображать список узлов xml в документе. Я сделал то же самое, используя TinyXML, но я нахожу Pugi намного приятнее и хотел бы продолжать его использовать.

Код программы:

#include <iostream>
#include <string>
#include <vector>
using namespace std;


#include "pugixml/src/pugixml.hpp"
#include "pugixml/src/pugiconfig.hpp"
#include "pugixml/src/pugixml.cpp"
using namespace pugi;

const char * identify(xml_node node)
{
    const char * type;
    switch(node.type())
    {
        case node_null:
            type = "Null";
            break;
        case node_document:
            type = "Document";
            break;
        case node_element:
            type = "Element";
            break;
        case node_pcdata:
            type = "PCDATA";
            break;
        case node_cdata:
            type = "CDATA";
            break;
        case node_comment:
            type = "Comment";
            break;
        case node_pi:
            type = "Pi";
            break;
        case node_declaration:
            type = "Declaration";
            break;
        case node_doctype:
            type = "Doctype";
            break;
        default:
            type = "Invalid";
    }
    return type;
}

void walk(xml_node parent)
{
    printf("%s:\t%s\t%s\n", identify(parent), parent.name(), parent.value());
    for(xml_node child = parent.first_child(); child != 0; child = parent.next_sibling())
    {
        walk(child);
    }
}

int main(int argc, char* argv[])
{
    for (int i=1; i<argc; i++)
    {
        xml_document doc;
        xml_parse_result result = doc.load_file(argv[i]);

        cout << argv[i] << ": " << result.description() << endl;

        if (result)
        {
            walk(doc);
        }
    }

    return 0;
}

Пример XML:

<?xml version="1.0" encoding="iso-8859-1" standalone="yes"?> 
<iOne>
    <iTwo>
        <iThree>
            <one>1</one>
            <two>2</two>
            <three>3</three>
        </iThree>
    </iTwo>

    <one>1</one>
    <two>2</two>
    <three>3</three>

</iOne>

Код работает до тех пор, пока не наткнется на первую из двух <three> и уйдет в бесконечный цикл, что наводит меня на мысль, что с условием в for(xml_node child = parent.first_child(); child != 0; child = parent.next_sibling()) что-то не так, но все так же, как в примерах? Я, вероятно, пропустил что-то довольно очевидное... хотя это мои первые детские шаги в С++ :)

Мне дано понять, что NULL в С++ - это просто 0, верно?

Кроме того (извините за несколько вопросов), действительно ли это правильный способ делать что-то с pugi? Кажется, для программы на C++ я не слишком часто использую указатели? Я запутался.


person Dreen    schedule 18.05.2011    source источник


Ответы (1)


Вы пытались изменить этот цикл for на:

for(xml_node child = parent.first_child(); child; child = child.next_sibling())

Вот как это делают примеры (traverse_base.cpp Например).

Важная часть child = child.next_sibling(), а не parent.next_sibling().

person Mat    schedule 18.05.2011
comment
Да, это то, что у меня было изначально, это все еще переходит в бесконечный цикл. - person Dreen; 18.05.2011
comment
обновил мой ответ - я думаю, что это более вероятно, чем предыдущее, о чем я упоминал. - person Mat; 18.05.2011
comment
Важная часть помогла мне сэкономить больше часов на поиске проблемы. Спасибо @Mat - person Han; 12.05.2020