使用pugixml在Codeblocks(C ++)中打开XML文件

时间:2014-11-11 16:02:54

标签: c++ codeblocks pugixml

我一直在寻找如何使用codeblocks和库pugixml解析xml文件,但我尝试了不同的方法,但它仍然不起作用。

我必须解析的XML包含一个图形(房屋),而我在C ++中的程序是使用结构来表示这个图形。

XML文件如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<WATSON>
  <PHILIPS> 125 </PHILIPS>
  <PEREZ> 254 </PEREZ>
  <SANTOS> 222 </SANTOS>
</WATSON>
<PHILIPS>
    <CENTER> 121 </CENTER>
    <WATSON> 125 </WATSON>
    <SANTOS> 55 </SANTOS>
</PHILIPS>
<PEREZ>
    <WATSON> 254 </WATSON>
    <CENTER> 110 </CENTER>
</PEREZ>

... ETC

C ++中的代码:(重要的部分:))

int main(){
    pugi::xml_document file;

    if (!file.load_file("Sample.xml")){
    cout << "Error loading file XML." << endl;
    system("PAUSE");
    return -1;
}
    pugi::xml_node node;
    getNodeInfo(node);
    cin.get();
    return 0;
}

void getNodeInfo(xml_node node){
    for (xml_node_iterator it = node.begin(); it != node.end(); ++it)
    {
        cout << it->name() << "\n--------\n";
        system("PAUSE");
        for (xml_attribute_iterator ait = it->attributes_begin(); ait != it->attributes_end(); ++ait)
    {
            cout << " " << ait->name() << ": " << ait->value() << endl;
    }
        cout << endl;
        for (xml_node_iterator sit = node.begin(); sit != node.end(); ++sit)
        {
            getNodeInfo(*sit);
    }
}
}

请告诉我,代码中的错误是什么?它总是进入if条件,我的意思是,它不加载文件。 谢谢!

1 个答案:

答案 0 :(得分:0)

我注意到了一些错误。

首先,您要向您的函数发送一个空节点,因此它无需处理任何内容。您应该发送您加载的文件:

int main()
{
    pugi::xml_document file;

    xml_parse_result res;
    if(!(res = file.load_file("test.xml")))
    {
        cout << "Error loading file XML: " << res.description() << endl;
        system("PAUSE");
        return -1;
    }

    pugi::xml_node node; // you are sending an EMPTY node
    // getNodeInfo(node);

    // Send the file you just loaded instead
    getNodeInfo(file);

    cin.get();
    return 0;
}

你的函数中的循环事件中也有一个奇怪的循环。您已经遍历节点的子节点,不需要对同一个子节点进行内循环:

void getNodeInfo(xml_node node)
{
    for(xml_node_iterator it = node.begin(); it != node.end(); ++it)
    {
        cout << it->name() << "\n--------\n";
//      system("PAUSE");
        for(xml_attribute_iterator ait = it->attributes_begin();
        ait != it->attributes_end(); ++ait)
        {
            cout << " " << ait->name() << ": " << ait->value() << endl;
        }
        cout << endl;
// You are already in a loop for this node so no need for this
//      for(xml_node_iterator sit = node.begin(); sit != node.end(); ++sit)
//      {
//          getNodeInfo(*sit);
//      }

        // just use the iterator you are already looping over
        getNodeInfo(*it);
    }
}

最后,您的XML数据格式不正确。它需要一个像这样的全包式标签:

<?xml version="1.0" encoding="UTF-8"?>
<HOUSES>
    <WATSON att="att1">
        <PHILIPS> 125 </PHILIPS>
        <PEREZ> 254 </PEREZ>
        <SANTOS> 222 </SANTOS>
    </WATSON>
    <PHILIPS>
        <CENTER> 121 </CENTER>
        <WATSON> 125 </WATSON>
        <SANTOS> 55 </SANTOS>
    </PHILIPS>
    <PEREZ>
        <WATSON> 254 </WATSON>
        <CENTER> 110 </CENTER>
    </PEREZ>
</HOUSES>

希望有所帮助。