使用 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 添加命名空间的主要内容,如果未能解决你的问题,请参考以下文章

提升序列化和命名空间

XML 命名空间有啥用?

使用 XSL 根据 XML 的条件添加命名空间

使用 Nokogiri 的 XML Builder 添加命名空间

如何使用 linq xml 将命名空间添加到 xml

Boost.Log 命名空间错误