使用 boost 向 XML 添加命名空间
Posted
技术标签:
【中文标题】使用 boost 向 XML 添加命名空间【英文标题】:adding namespaces to XML with boost 【发布时间】:2016-05-05 18:33:38 【问题描述】:我正在尝试使用 boost 生成一个 xml。到目前为止一切顺利,但是生成的 xml 需要有一个命名空间。
所以不是<name>"Harry"</name>
,而是<ns1:name>"Harry"</ns1:name>
有没有办法通过 boost 向 XML 添加命名空间,而无需手动将“ns1”添加到每一行?
【问题讨论】:
【参考方案1】:有没有办法通过 boost 向 XML 添加命名空间,而无需手动将“ns1”添加到每一行?
假设您使用 rapidxml,不,您不能。但是,您可以扩展 rapidxml 以支持此功能或获取支持此功能的解析器的副本(请参阅 sehe 的答案)。
有 even a fork 的 rapidxml 已经支持这个(你只需要替换它)。或者您可以通过手动添加字符串来添加命名空间。
【讨论】:
这个很好的信息。我刚刚发现 PugiXML 甚至不支持 XML 命名空间(正确地)。 :| Boost Property Tree 或许还能帮上忙……【参考方案2】:Boost 没有 XML 库,所以你不能。
我建议从这里选择您的 XML 库:What XML parser should I use in C++?
我个人最喜欢的是 PugiXML 更新 Pugi 不支持命名空间(eek):
Namespace nodes are not supported (affects namespace:: axis).
但是,要回答这部分问题:
有没有办法通过 boost 向 XML 添加命名空间,而无需手动将“ns1”添加到每一行?
您可以在逻辑上使用(可疑的)功能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
【讨论】:
为 Boost 属性树添加了一个开箱即用的解决方法 我喜欢这个选项,但我觉得另一个解析器可能是更好的选择:) @FlorisVelleman 当然可以。这只是要意识到的事情(OP 提出问题的方式让我觉得他不了解 XML 命名空间)【参考方案3】:所以,我设法得到了我想要的结果。这是我所做的:
我最外层的元素被称为“文档”:
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>
可能不是最好的解决方案,但它适合我的需要。
【讨论】:
以上是关于使用 boost 向 XML 添加命名空间的主要内容,如果未能解决你的问题,请参考以下文章