使用Boost为XML添加命名空间

4

我正在尝试使用boost生成xml。目前进展顺利,但是生成的xml需要有命名空间。

因此,与其说是<name>"Harry"</name>,不如说是<ns1:name>"Harry"</ns1:name>

是否有一种方法可以在不手动添加“ns1”到每一行的情况下,使用boost向XML添加命名空间?

3个回答

2
有没有办法在不手动添加“ns1”到每一行的情况下,使用boost向XML添加命名空间?
假设您使用的是rapidxml,那么不行。不过,您可以扩展rapidxml来支持此功能,或者获取一个支持此功能的解析器副本(请参见sehe的答案)。
已经有一个rapidxml分支支持此功能(您只需替换它)。或者,您可以通过手动添加字符串来添加命名空间。

1
这是个好信息。我刚发现PugiXML甚至不支持XML命名空间(正确地)。:| Boost Property Tree可能仍然有所帮助... - sehe

1
Boost没有XML库,所以你不能使用它。我建议从这里选择你的XML库:What XML parser should I use in C++?。我的个人喜好是PugiXML。更新:Pugi不支持命名空间(呃):Namespace nodes are not supported (affects namespace:: axis).。然而,回答问题的这部分:有没有办法在XML中添加命名空间,而不必手动添加"ns1"到每一行?你可以通过(可疑的)特性Default Namespaces逻辑地实现它。
<?xml version="1.0"?>
library xmlns="http://eric.van-der-vlist.com/ns/library">
...
</library>

即使没有前缀,所有内容都将从该命名空间逻辑地呈现。

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

将xml-stylesheet处理指令添加到boost property_tree


1
为 Boost Property Tree 添加了一个开箱即用的解决方案。 - sehe
1
我喜欢这个选择,但在考虑后,我觉得另一个解析器可能是更好的选择 :) - Floris Velleman
1
@FlorisVelleman 当然没问题。这只是一个需要“意识到”的事情(根据OP提出的问题方式,我认为他不知道XML命名空间的相关知识)。 - sehe

0

所以,我成功地得到了我想要的结果。这是我所做的:

我的最外层元素名为“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>

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接