xml – boost属性树
发布时间:2020-12-16 23:19:59 所属栏目:百科 来源:网络整理
导读:我正在使用boost属性迭代 XML文档 树并将结果存储在结构中.我遇到的问题是我可以 只到达第一个“项目”节点,无法访问第二个“项目” 节点.我希望有人能指出我犯了错误的地方. 我的程序输出看起来像这样(你可以看到项目丢失..那里 没有显示cookie2,candy2或ch
我正在使用boost属性迭代
XML文档
树并将结果存储在结构中.我遇到的问题是我可以 只到达第一个“项目”节点,无法访问第二个“项目” 节点.我希望有人能指出我犯了错误的地方. 我的程序输出看起来像这样(你可以看到项目丢失..那里 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开始重复. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |