如何重命名提升属性树中的节点/元素?

Posted

技术标签:

【中文标题】如何重命名提升属性树中的节点/元素?【英文标题】:How to rename node/element in boost property tree? 【发布时间】:2015-06-03 22:07:39 【问题描述】:

例如,我有以下结构的 boost 属性树(通过使用 xml 或其他方式读取流创建):

<A>
  <B>
    <C></C>
  </B>
</A>

如何将 现有 树元素 B 重命名为具有新键的新元素:N。因此,调用此固定树的 write_xml 应该会给出新的 xml 结构:

<A>
  <N>
    <C></C>
  </N>
</A>

如果可能,请提供代码或解释原因。 备注:将C下的子树附加到新生成的根也可以,但优先直接重命名。

【问题讨论】:

工资多少? 2 天内有资格获得赏金的问题。为了钱,我通常自己编写代码。 我在嘲笑你自己显示零代码的事实。大量干巴巴的要求使这看起来像是工作。 Anyhoops,不需要更多虚构的互联网点 :) 干杯 【参考方案1】:

那么,这是可能的。 发送检查代码

Live On Coliru

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

using boost::property_tree::ptree;

int main() 
    std::istringstream iss(R"(<A><B><C></C></B></A>)");

    ptree pt;
    read_xml(iss, pt);

    pt.add_child("A.N", pt.get_child("A.B"));
    pt.get_child("A").erase("B");

    write_xml(std::cout, pt);

打印

<?xml version="1.0" encoding="utf-8"?>
<A><N><C/></N></A>

【讨论】:

我认为有一些评论和聊天相关的徽章(想到了Pundit) 是否会在丢弃 A.B 之前将 A.B (深度)复制到 A.N?如果有,是否有带有移动语义的版本? @gg99 Boost 属性树不支持移动。 (太老)。使用底层容器(Boost Multi-Index),您可以通过各种优雅的方式实现效果,但这需要深入了解该库的实现细节。然而,这些都不重要,因为 Boost Property Tree 既不是为任何对性能敏感的东西而设计的,也不适合任何对性能敏感的东西。当人们想用它做低纬度的事情时,他们总是应该使用一个好的 JSON 或 XML 库来代替。

以上是关于如何重命名提升属性树中的节点/元素?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 WinForms 中禁用 TreeView 的节点重命名?

sh 重命名目录树中的文件扩展名

使用 XSLT 重命名节点

基于“名称”属性使用 XSLT 重命名 XML 节点

XSLT 用属性值重命名元素

[重命名应用程序中的树节点时重命名文件夹名称