我正在使用boost属性迭代
XML文档
树并将结果存储在结构中.我遇到的问题是我可以
只到达第一个“项目”节点,无法访问第二个“项目”
节点.我希望有人能指出我犯了错误的地方.
树并将结果存储在结构中.我遇到的问题是我可以
只到达第一个“项目”节点,无法访问第二个“项目”
节点.我希望有人能指出我犯了错误的地方.
我的程序输出看起来像这样(你可以看到项目丢失..那里
没有显示cookie2,candy2或chocolate2项目):
jar : snAcks snack : coOkie item : cooKie1 snack : canDy item : caNdy1 snack : cHocolate item : choColate1
这是xml文件:
<root> <jar name="snAcks"> <snack name="coOkie"> <item name="cooKie1"></item> <item name="cookIe2"></item> </snack> <snack name="canDy"> <item name="caNdy1"></item> <item name="candY2"></item> </snack> <snack name="cHocolate"> <item name="choColate1"></item> <item name="chocOlate2"></item> </snack> </jar> </root>
这是源代码:
void parse_xml( boost::property_tree::iptree const& pt ) { BOOST_FOREACH( boost::property_tree::iptree::value_type const& v,pt.get_child("root.jar") ) { // Show jar if ( boost::iequals( v.first,"<xmlattr>" ) ) { std::cout << "jar : " << v.second.get<std::string>("NaME") << std::endl; } if ( boost::iequals( v.first,"snack" ) ) { // Show snack std::cout << "snack : " << v.second.get<std::string>("<xmlattr>.name") << std::endl; try { BOOST_FOREACH( boost::property_tree::iptree::value_type const& val,v.second.get_child("item") ) { if ( boost::iequals( val.first,"<xmlattr>" ) ) { // Show item std::cout << "item : " << val.second.get<std::string>("nAmE") << std::endl; } } } catch (boost::property_tree::ptree_bad_path& e) { // Show what caused exception std::cout << "Exception: " << e.what() << std::endl; } } } }
感谢您花时间阅读本文.我想我做得很简单
错,但无法理解的地方.
解决方法
我想通了,但这不是我所说的直观的xml-parser库.
void parse_xml( boost::property_tree::iptree const& pt ) { BOOST_FOREACH(boost::property_tree::iptree::value_type const& v,pt.get_child("root.jar")) { // Show jar if ( boost::iequals( v.first,"<xmlattr>" ) ) { std::cout << "jar : " << v.second.get<std::string>("NaME") << std::endl; } if ( boost::iequals( v.first,"snack" ) ) { BOOST_FOREACH(boost::property_tree::iptree::value_type const& val,v.second) { // Show snack if ( boost::iequals( val.first,"<xmlattr>" ) ) { std::cout << "snack : " << val.second.get<std::string>("name") << std::endl; } if ( boost::iequals(val.first,"item") ) { BOOST_FOREACH(boost::property_tree::iptree::value_type const& val2,val.second) if ( boost::iequals( val2.first,"<xmlattr>" ) ) { // Show item std::cout << "item : " << val2.second.get<std::string>("nAmE") << std::endl; } } } } } }
如果您比较两个代码段,您可以看到我的结构更加规则.
>遍历所有节点>处理< xmlattr>节点>处理“真实”节点.>从该节点内的步骤1开始重复.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。