首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用PugiXML进行XML解析,无限循环

使用PugiXML进行XML解析,无限循环
EN

Stack Overflow用户
提问于 2011-05-18 22:51:56
回答 1查看 4.5K关注 0票数 2

这几乎是我编写的第一个C++程序,它应该显示文档中的xml节点列表。我用TinyXML做了同样的事情,但我发现Pugi好多了,我想继续使用它。

程序代码:

代码语言:javascript
复制
#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:

代码语言:javascript
复制
<?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++中的第一个小步骤:)

我知道C++中的NULL就是0,对吧?

另外(抱歉问了很多问题),这真的是用pugi做事情的正确方式吗?对于一个C++程序,我似乎不太使用指针?我很困惑。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-05-18 23:05:30

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

代码语言:javascript
复制
for(xml_node child = parent.first_child(); child; child = child.next_sibling())

示例就是这样做的(例如traverse_base.cpp)。

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

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6046728

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档