【问题标题】:XML parsing with PugiXML, infinite loop使用 PugiXML 解析 XML,无限循环
【发布时间】:2011-05-18 14:51:55
【问题描述】:

这几乎是我制作的第一个 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>

代码一直有效,直到遇到两个&lt;three&gt;s 中的第一个并进入无限循环,这让我觉得for(xml_node child = parent.first_child(); child != 0; child = parent.next_sibling()) 中的条件有问题,但一切都与示例中的相同吗?我可能错过了一些非常明显的东西......不过,这些是我在 C++ 中的第一步:)

我知道 C++ 中的 NULL 只是 0 对吗?

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

【问题讨论】:

    标签: c++ xml mingw infinite-loop pugixml


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 是的,原来我就是这样的,它仍然进入无限循环。
    • 更新了我的答案 - 我认为这比我之前提到的更有可能。
    • “重要部分”帮助我节省了更多时间来搜索问题。谢谢@Mat
    猜你喜欢
    • 1970-01-01
    • 2019-06-24
    • 2011-09-01
    • 2010-12-28
    • 2018-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多