使用 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>
可能不是最好的解决方案,但它适合我的需要。
我正在尝试使用 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>
可能不是最好的解决方案,但它适合我的需要。