如何使用 boost ptree 删除 xml 属性?

Posted

技术标签:

【中文标题】如何使用 boost ptree 删除 xml 属性?【英文标题】:how to remove xml's attribute using boost's ptree? 【发布时间】:2014-02-01 18:39:25 【问题描述】:

如何使用boost的ptree删除xml属性title? 我有一个 xml,我尝试按照代码删除属性 title 并保存到新 xml 但失败(new.xml 仍然有 title 属性)。

xml:

<?xml version="1.0" encoding="utf-8"?>
<tokens title="issues"></tokens>

代码:

 ptree pt;
 read_xml("C://old.xml", pt);

 pt.erase("tokens.<xmlattr>.title"); //try one
 pt.erase("tokens.<xmlattr>"); //try two

 write_xml("C://new.xml", pt);

有没有boost ptree删除属性的方法?

【问题讨论】:

This 似乎有效(我认为这是因为erase 只能影响ptree 的直系子级,但我不确定)。如果您用boost-propertytree 标记您的问题,您将有更好的机会找到图书馆专家。 【参考方案1】:

您可以尝试这样的事情(通过适当的错误处理):

#include <boost/property_tree/xml_parser.hpp>
#include <boost/property_tree/exceptions.hpp>
#include <sstream>
#include <iostream>

using namespace boost;
using namespace  boost::property_tree;
using namespace std;


int main()

    ptree pt;
    
        std::stringstream strm;
        strm << "<?xml version='1.0' encoding='utf-8'?> <tokens title='issues'></tokens>";
        read_xml(strm, pt);
    

    pt.find("tokens")->second.erase("<xmlattr>");

    write_xml(cout, pt, xml_writer_make_settings(' ', 2));

输出:

$ ./test
<?xml version="1.0" encoding="utf-8"?>
<tokens/>

【讨论】:

或者你可以使用:pt.get_child("tokens").erase(""); 如何删除 xmlattrs 之一但不是所有 xmlattrs? 3ks @jiafu 删除可以使用的单个属性:pt.get_child("tokens.&lt;xmlattr&gt;").erase("title"); 但是,为什么我不能通过 pt.erase("tokens..title"); 删除 @jiafu 方法 erase() 接受 key_type 或迭代器作为参数(不是 path_type)。我猜这是因为路径可能不明确(如果某些节点具有相同的名称),因此 property_tree 接口可以防止意外删除元素。请参阅basic_tree 定义。

以上是关于如何使用 boost ptree 删除 xml 属性?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 ptree(boost) 遍历 XML 文件中的同名子级?

如何使用 Boost ptree C++ 解析其值中包含 HTML 标记的 XML

如何使 boost ptree 以相同的方式解析 xml 和 json?

Boost Property ptree:boost write_xml 在 xml 文件的子元素中添加 unicode 0x0 字符

c++ boost xml解析器ptree.get函数——不接受节点名中的空格

我们如何在另一个 boost ptree 中插入一个 boost ptree 作为节点?