我正在尝试使用boost生成xml。到目前为止一切顺利,但是生成的xml需要有一个命名空间。
所以与其说<name>"Harry"</name>
,不如说<ns1:name>"Harry"</ns1:name>
有没有办法使用 boost 将命名空间添加到 XML,而无需手动将"ns1"添加到每一行?
有没有办法使用 boost 将命名空间添加到 XML,而无需手动将"ns1"添加到每一行?
假设你使用rapidxml,不,你不能。但是,您可以扩展 rapidxml 以支持这一点,或者获取支持此功能的解析器的副本(参见 sehe 的答案)。
甚至还有一个已经支持此功能的 rapidxml 分支(您只需要替换它)。或者,您可以通过手动添加字符串来添加命名空间。
Boost 没有 XML 库,所以你不能。
我建议从这里选择你的XML库:我应该在C++中使用什么XML解析器?
我个人最喜欢的是PugiXMLUpdate Pugi不支持命名空间(eek):
不支持命名空间节点(影响命名空间::轴)。
但是,要回答这部分问题:
有没有办法使用 boost 将命名空间添加到 XML,而无需手动将"ns1"添加到每一行?
从逻辑上讲,您可以使用(可疑的)功能默认命名空间来实现:
<?xml version="1.0"?>
library xmlns="http://eric.van-der-vlist.com/ns/library">
...
</library>
即使没有前缀,所有内容都将从该命名空间逻辑上被视为。
现在,boost 没有记录如何做到这一点,但你可以使用它:
添加 xml 样式表处理指令以提高property_tree
所以,我设法得到了我想要的结果。这是我所做的:
我最外层的元素称为"文档":
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>
可能不是最好的解决方案,但它适合我的需求。