如何使用 boost::property_tree 重置 xml 元素的属性?

Posted

技术标签:

【中文标题】如何使用 boost::property_tree 重置 xml 元素的属性?【英文标题】:How to RESET attribute of xml element using boost::property_tree? 【发布时间】:2018-05-04 18:51:53 【问题描述】:

我有一个 xml 文件,我需要修改该文件中的一些属性。

我的 xml 文件如下所示:

<ns0:App xmlns:ns0="AppSchema" MyDir1="C:\App\Dir1" MyDir2="C:\App\Dir2"  ..... some other attributes>
    <ns0:Backend DisableBackend="false">
        <ns0:Logging EnableLogging="false" LogPath="c:\mylogs"/>
        <ns0:ExternalTool EnableTool="false"/>
    </ns0:Backend>
</ns0:App>

我需要在这个 xml 文件中修改 MyDir1、MyDir2、EnableLogging、EnableTool 等属性的值。

谷歌搜索帮助我从属性中获取值,但没有运气 - 如何修改属性值,或者我可能没有使用正确的语法。

有人可以指导我吗?

我试过的代码如下:

#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/xml_parser.hpp>
using namespace boost::property_tree;

int main()

    std::string xml_original = "C:\\temp\\config.xml";
    std::string xml_updated = "C:\\temp\\config_updated.xml";

    ptree tree;
    read_xml(sysCfg, tree);

    std::cout<<"old value: " << tree.get<std::string>("App.<xmlattr>.MyDir1");
    tree.put("App.<xmlattr>.MyDir1", "newPath");

    xml_writer_settings<char> w(' ', 4);
    write_xml(xml_updated, tree, std::locale(), w);

【问题讨论】:

【参考方案1】:

您必须包含命名空间。我还使用了std::string 作为xml_writer_settings

#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/xml_parser.hpp>
#include <iostream>

using namespace boost::property_tree;

int main()

    std::string xml_original = "config.xml";
    std::string xml_updated = "config_updated.xml";

    ptree tree;
    read_xml(xml_original, tree);

    // must include the ns0 namespace
    std::cout << "old value: " << tree.get<std::string>("ns0:App.<xmlattr>.MyDir1");
    tree.put("ns0:App.<xmlattr>.MyDir1", "newPath");

    xml_writer_settings<std::string> w(' ', 4);
    write_xml(xml_updated, tree, std::locale(), w);

【讨论】:

tree.put("ns0:App..MyDir1", "newPath");它对我有用,感谢您的帮助:) 但是, xml_writer_settings<:string> w(' ', 4); write_xml(xml_updated, 树, std::locale(), w);导致错误:错误 C2664:'boost::property_tree::xml_parser::write_xml':无法将参数 4 从 'boost::property_tree::xml_parser::xml_writer_settings' 转换为 'const boost::property_tree::xml_parser: :xml_writer_settings &' , 但 xml_writer_settings w(' ', 4);在这里工作 不客气。很高兴听到它最终成功了。

以上是关于如何使用 boost::property_tree 重置 xml 元素的属性?的主要内容,如果未能解决你的问题,请参考以下文章

如何区分两个 boost::property_tree?

如何将任何值转换为对象并使用 boost::property_tree json 添加成员

如何使用 json 解析器的 boost property_tree 创建空数组节点

为自定义路径类型设置 boost property_tree

如何扩展 boost property_tree 来处理自定义类型?

使用 boost::property_tree 读取 ini 文件不适用于 A.x 形式的子级