使用 boost 将命名空间添加到 XML

adding namespaces to XML with boost

我正在尝试使用 boost 生成 xml。到目前为止一切顺利,但是生成的 xml 需要有一个命名空间。

所以而不是 <name>"Harry"</name> 它会说 <ns1:name>"Harry"</ns1:name>

有没有什么方法可以使用 boost 将命名空间添加到 XML 而无需手动将 "ns1" 添加到每一行?

Boost 没有 XML 库,所以你不能。

我建议从这里选择您的 XML 图书馆:What XML parser should I use in C++?

我个人最喜欢的是 PugiXML Update Pugi 不支持命名空间 (eek):

Namespace nodes are not supported (affects namespace:: axis).

但是,要回答这部分问题:

Is there any way to add a namespace to the XML with boost without manually adding the "ns1" to every line?

您可以逻辑上使用(可疑的)功能Default Namespaces:

<?xml version="1.0"?>
library xmlns="http://eric.van-der-vlist.com/ns/library">
...
</library>

即使没有前缀,一切都将被视为符合逻辑的名称空间。

现在,boost 没有记录如何执行此操作,但您可以了解它:

Add xml-stylesheet processing instructions to boost property_tree

Is there any way to add a namespace to the XML with boost without manually adding the "ns1" to every line?

假设您使用 rapidxml,不,您不能。但是,您可以扩展 rapidxml 以支持此功能或获取支持此功能的解析器的副本(请参阅 sehe 的回答)。

rapidxml 的 even a fork 已经支持此功能(您只需替换它)。或者您可以通过手动添加字符串来添加命名空间。

所以,我设法得到了我想要的结果。这是我所做的:

我最外层的元素叫做 'Document':

ptree& documentnode = pt.add("namespace1:Document", "");

然后为每个命名空间的元素添加标签:

pt.add("Document.<xmlattr>.xmlns:namespace1", "value");

然后在每个元素前面我必须添加 "namespace1":

documentnode.add("namespace1:name", "Harry");

输出:

<namespace1:Document xmlns:namespace1=value>
    <namespace1:name>Harry</namespace1:name>
</namespace1:Document>

可能不是最好的解决方案,但它适合我的需要。