加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

xml – boost属性树

发布时间:2020-12-16 23:19:59 所属栏目:百科 来源:网络整理
导读:我正在使用boost属性迭代 XML文档 树并将结果存储在结构中.我遇到的问题是我可以 只到达第一个“项目”节点,无法访问第二个“项目” 节点.我希望有人能指出我犯了错误的地方. 我的程序输出看起来像这样(你可以看到项目丢失..那里 没有显示cookie2,candy2或ch
我正在使用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开始重复.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读