将字符串中包含的 XML 作为 XML 节点添加到现有的 pugixml 树

Add XML contained in string as XML nodes to existing pugixml tree

我有一个配置文件saver/loader。除了预期的数据,还有一个 <CustomData> 节点。保存节点时,我们只需要一个 std::string _customData 并将其添加到节点中,如下所示:

  pugi::xml_document doc;
  pugi::xml_node config = doc.append_child("OurConfig");

  // save custom data
  pugi::xml_node customData = config.append_child("CustomData");
  customData.append_child(pugi::node_pcdata).set_value(_customData);

我们的 _customData 是 base64 编码的 XML。它由应用程序的另一部分提供。它必须是一个字符串,因为应用程序的另一部分使用不同的编程语言 (C#)。可以想象,这变得很烦人,因为它不是人类可读的。解决此问题的第一步只是在提供 _customData 的应用程序中摆脱 base64。所以现在我们有了可读版本,看起来像这样:

    <?xml version="1.0"?>
    <OurConfig>
        <CustomData>&lt;CfgRoot&gt;
&lt;SomeValue name="External setting for foo" value="Foo"/&gt;
&lt;SomeValue name="External setting for bar" value="Bar"/&gt;
&lt;/CfgRoot&gt;</CustomData>
    </OurConfig>

但如果将自定义数据直接附加到 XML 树而不是作为字符串值,它可能会有所改进。如何将 XML 字符串作为 XML 而不是字符串附加到 pugixml 树?

即。我想要的输出:

<?xml version="1.0"?>
<OurConfig>
    <CustomData>
    <CfgRoot>
      <SomeValue name="External setting for foo" value="Foo"/>
      <SomeValue name="External setting for bar" value="Bar"/>
    </CfgRoot>
  </CustomData>
</OurConfig>

docs中列出了三个方法。我用了第一个,做了一个这样的方便函数:

bool AppendXMLString(pugi::xml_node target, const std::string& srcString)
{
  // parse XML string as document
  pugi::xml_document doc;
  if (!doc.load_buffer(srcString.c_str(), srcString.length()))
    return false;

  for (pugi::xml_node child = doc.first_child(); child; child = child.next_sibling())
    target.append_copy(child);
  return true;
}