将字符串中包含的 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><CfgRoot>
<SomeValue name="External setting for foo" value="Foo"/>
<SomeValue name="External setting for bar" value="Bar"/>
</CfgRoot></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;
}
我有一个配置文件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><CfgRoot>
<SomeValue name="External setting for foo" value="Foo"/>
<SomeValue name="External setting for bar" value="Bar"/>
</CfgRoot></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;
}