Boost 解析xml——插入Item

XML格式为

 

<?xml version="1.0" encoding="utf-8"?>
<Config>  
  <Item name="A" desc="">
        <ChildItem name="name" desc="" datatype="string">11111</ChildItem>
        <ChildItem name="subject" desc="" datatype="string">22222</ChildItem>
        <ChildItem name="desc" desc="" datatype="string">33333</ChildItem>
        <ChildItem name="state" desc="" datatype="int">444444</ChildItem>
        <ChildItem name="ID" desc="" datatype="int">55555</ChildItem>
   </Item>
</Config>

 

需求:将另一段同样格式xml的Item插入到现在这个Item下面

<?xml version="1.0" encoding="utf-8"?>
<Config>  
  <Item name="A" desc="">
        <ChildItem name="name" desc="" datatype="string">11111</ChildItem>
        <ChildItem name="subject" desc="" datatype="string">22222</ChildItem>
        <ChildItem name="desc" desc="" datatype="string">33333</ChildItem>
        <ChildItem name="state" desc="" datatype="int">444444</ChildItem>
        <ChildItem name="ID" desc="" datatype="int">55555</ChildItem>
   </Item>
   <Item name="B" desc="">
        <ChildItem name="name" desc="" datatype="string">11111</ChildItem>
        <ChildItem name="subject" desc="" datatype="string">22222</ChildItem>
        <ChildItem name="desc" desc="" datatype="string">33333</ChildItem>
        <ChildItem name="state" desc="" datatype="int">444444</ChildItem>
        <ChildItem name="ID" desc="" datatype="int">55555</ChildItem>
   </Item>
</Config>


这样

 

代码:

 

  wstring filePath = m_resourceFilePath.m_TrainingResourcePath + pStrid + m_resourceFilePath.m_TrainingXMLFilePath;
    CPLSimXmlConfigurationFile m_manageConfig;
   // m_manageConfig.m_filename;
    m_manageConfig.InitConfigFile(PLSimLocale::WStringToString(filePath));
    wptree read_pt;
    //原来的xml直接复制过去,因为是第一个循环所以只会复制第一个xml
    wptree copy_pt;
    copy_pt = m_manageConfig.m_pt;
    try
    {
        //判断库文件是否有xml内容
        std::locale utf8Locale(std::locale(), new std::codecvt_utf8<wchar_t>);
        boost::property_tree::read_xml(PLSimLocale::WStringToString(m_resourceFilePath.m_ResourceStoreXMLPath), read_pt, boost::property_tree::xml_parser::trim_whitespace, utf8Locale);
        //没有xml,直接将第一个xml复制过来
        if (!read_pt.get_child_optional(L"Config"))
        {
            copy_pt = copy_pt.get_child(L"Config");
            for (wptree::assoc_iterator iter = copy_pt.find(L"Item"); iter != copy_pt.not_found(); ++iter)
            {
               wstring strFirstAttrName = iter->second.get<wstring>(L"<xmlattr>.name");
            }
            std::locale utf8Locale(std::locale(), new std::codecvt_utf8<wchar_t>);
            auto settings = boost::property_tree::xml_writer_make_settings<std::wstring>(L'\t', 1);
            write_xml(PLSimLocale::WStringToString(m_resourceFilePath.m_ResourceStoreXMLPath), m_manageConfig.m_pt, utf8Locale, settings);


        }
        else
        {
            //从每个配置文件读第一个Item属性
            wstring strConfigAttrName;
            //判断库文件里xml结构是否完整
            if (read_pt.get_child_optional(L"Config.Item"))
            {
                wptree copy_pt1 = copy_pt;
                copy_pt1 = copy_pt1.get_child(L"Config");
                for (wptree::assoc_iterator iter = copy_pt1.find(L"Item"); iter != copy_pt1.not_found(); ++iter)
                {
                    strConfigAttrName = iter->second.get<wstring>(L"<xmlattr>.name");
                }
                //去掉从库文件里读的头
                read_pt = read_pt.get_child(L"Config");
                //去掉从配置文件中读的头
                copy_pt = copy_pt.get_child(L"Config.Item");
                //合并xml
                wptree array_pt;
                array_pt.add_child(L"Item", read_pt);
                array_pt = array_pt.get_child(L"Item");
                auto& b = array_pt.add_child(L"Item", copy_pt);
                b.put(L"<xmlattr>.name", strConfigAttrName);
                b.put(L"<xmlattr>.desc", L"");
                wptree all_pt;
                all_pt.put_child(L"Config", array_pt);
                std::locale utf8Locale(std::locale(), new std::codecvt_utf8<wchar_t>);
                auto settings = boost::property_tree::xml_writer_make_settings<std::wstring>(L'\t', 1);
                write_xml(PLSimLocale::WStringToString(m_resourceFilePath.m_ResourceStoreXMLPath), all_pt, utf8Locale, settings);
            }
        }
    }
    catch (boost::property_tree::ptree_bad_path& e)
    {
        m_error = PLSimLocale::StringToWString(e.what());
        return false;
    }
    catch (boost::property_tree::ptree_bad_data& e)
    {
        m_error = PLSimLocale::StringToWString(e.what());
        return false;
    }

 

posted @ 2017-08-27 15:14  ye_ming  阅读(1205)  评论(0编辑  收藏  举报