我一直在寻找如何使用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条件,我的意思是,它不加载文件。 谢谢!
答案 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>
希望有所帮助。