我有一个格式为
的XML文件<Objects>
<Object>
<Id>1</Id>
<Name>Head</Name>
</object>
<Object>
<Id>2</Id>
<Name>Right Hand</Name>
</object>
<Object>
<Id>3</Id>
<Name>Left Hand</Name>
</object>
<Object>
<Id>4</Id>
<Name>Right hand</Name>
</object>
<Object>
<Id>5</Id>
<Name>Cup</Name>
</object>
<Object>
<Id>6</Id>
<Name>Book</Name>
</object>
</Objects>
我想用一个循环来按对象访问我的文件对象:
xml_node nodeObjects = doc.child("Objects").child("Object");
for(xml_node_iterator it = nodeObjects.begin(); it != nodeObjects.end(); ++it)
{
cout<<"Name = "<<it->child_value("Name")<<endl;
}
还有:
xml_node nodeObjects = doc.child("Objects");
for(xml_node nodeObject = nodeObjects.first_child(); nodeObject; nodeObject = nodeObject.next_sibling())
{
numOfObjects += 1;
const char *id = nodeObject.child_value("Id");
const char *name = nodeObject.child_value("Name");
//cout<<"ID = "<<id<<" Name = "<<name<<endl;
//cout<<nodeObjects.next_sibling("Object").child_value("Id")<<endl;;
}
最后:
xml_node nodeObjects = doc.child("Objects");
for(xml_node nodeObjects: nodeObjects.children("Object"))
{
}
虽然前两个方法没有打印预期结果(只有第一次迭代有效),但编译器说第三种方法是语法错误!
任何帮助!
答案 0 :(得分:2)
您的XML文件格式错误 - 结束标记名称应与开始标记匹配,比较区分大小写。请记住,通过检查xml_document :: load_file返回值,始终检查文档是否已成功加载。就像现在一样,解析可能会失败并且你得到一个空文档(或者说文档的一部分直到第一个错误,即只是第一个对象)。
第一个循环遍历nodeObjects的子节点;为了使它工作,nodeObjects应该引用Objects标签,而不是它的第一个Object子。
第二个和第三个循环看起来很好 - 第三个循环使用C ++ 11功能,因此不适用于不支持它的编译器。