我有一个xml
<MyXML>
<Tag2>2</Tag2>
<Tag3>3</Tag2>
<Tag4>4</Tag3>
</MyXML>
使用boost :: property_tree :: read_xml将其读入boost :: property_tree :: ptree xmlroot
现在,如果我按
添加新节点xmlroot.add("MyXML.Tag1", "1");
此新节点将添加到现有标记的后面。在boost :: property_tree :: write_xml之后,我得到了
<MyXML>
<Tag2>2</Tag2>
<Tag3>3</Tag2>
<Tag4>4</Tag3>
<Tag1>1</Tag1>
</MyXML>
有没有办法在Tag2前插入新节点?
答案 0 :(得分:1)
这是可能的,但它超出了get
和add
等标准访问器的范围,因此必须采用更长,更繁琐的迭代器方式。基本上,您需要为节点获取迭代器,并使用insert
或push_front
在所需位置插入新节点。
完整示例。:
#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/xml_parser.hpp>
#include <string>
#include <exception>
#include <iostream>
namespace pt = boost::property_tree;
int main()
{
try
{
std::string xml_content =
"<MyXML> \
<Tag2>2</Tag2> \
<Tag3>3</Tag2> \
<Tag4>4</Tag3> \
</MyXML>";
std::stringstream xml (xml_content);
pt::ptree tree;
pt::read_xml (xml, tree);
/* ~~~~ KEY STUFF ~~~~ */
auto root = tree.find("MyXML");
root->second.push_front({"NewTag", decltype(tree)("1")});
/* ~~~~ KEY STUFF ~~~~ */
pt::write_xml (std::cout, tree);
}
catch (std::exception &e)
{
std::cout << "Error: " << e.what() << "\n";
}
return 0;
}
关键的东西解释说:
auto root = tree.find("MyXML");
root->second.push_front({"NewTag", decltype(tree)("1")});
好的,所以第一行是没脑子的,我们需要让我们的工作&#34;节点
第二行使用push_front
,它在调用者的前面插入一个新节点。但是调用者位于迭代器的second
字段,这是find("MyXML")
的结果。
然后push_front
需要一对密钥和self_type
。我使用了对象的大括号初始化,以及键的字符串文字。创建匹配类型的新节点有点棘手,因为使用值的构造函数被标记为显式。所以,必须使用它的类型。我使用decltype
的{{1}}获得了它。
如果可以简化任何事情,我很高兴地欢迎所有改进。