使用PugiXML进行XML解析,无限循环 [英] XML parsing with PugiXML, infinite loop

查看:146
本文介绍了使用PugiXML进行XML解析,无限循环的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这几乎是我编写的第一个C ++程序,它应在文档中显示xml节点列表.我使用TinyXML进行了完全相同的操作,但是我发现Pugi更好,并且希望继续使用它.

this is pretty much the first C++ program that I ever made, it should display a list of xml nodes in the document. I made an exact same thing work using TinyXML, but I find Pugi much nicer and would like to continue using it.

程序代码:

#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>

代码有效,直到遇到两个<三个> 中的第一个并进入无限循环,这使我认为 for(xml_node child = parent.first_child(); child!= 0; child = parent.next_sibling()),但是一切都与示例中的相同吗?我可能错过了一些显而易见的东西……尽管这是我在C ++中迈出的第一步:)

The code works until it comes across the first of the two <three>s and goes into an infinite loop, which mades me think there is something wrong with condition in for(xml_node child = parent.first_child(); child != 0; child = parent.next_sibling()) but everything is the same as in examples? I probably missed something pretty obvious... these are my first baby steps in c++ though :)

我可以理解C ++中的NULL只是0,对吗?

I am given to understand NULL in C++ is just 0 right?

(很抱歉询问多个问题),这真的是对付Pugi的正确方法吗?对于C ++程序,我似乎不使用太多指针?我很困惑.

Also (sorry for asking multiple questions), is this really a correct way of doing stuff with pugi? For a C++ program, I dont seem to be using pointers much? Im confused.

推荐答案

您是否尝试过将 for 循环更改为:

Have you tried changing that for loop to:

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

这是示例的操作方式( traverse_base.cpp ).

This is how the samples do it (traverse_base.cpp for example).

重要的部分是 child = child.next_sibling(),而不是 parent.next_sibling().

The important part is child = child.next_sibling(), not parent.next_sibling().

这篇关于使用PugiXML进行XML解析,无限循环的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆