Boost 属性 ptree:boost write_xml 在 xml 文件的子元素中添加 unicode 0x0 字符

桑迪帕蒂达

我正在使用 boostwrite_xml函数来创建 xml。我能够使用 Boost 创建成功的 xml。但它在 xml 子元素的末尾添加了额外的 unicode 0x0 字符。

代码片段:

boost::property_tree::write_xml(oss, pt, boost::property_tree::xml_writer_make_settings<std::string>(' ', 4));

我正在将此 xml 发送到 Java Side 应用程序,并且在解析 boost 创建的 xml 时,Java 抛出以下异常错误。

在文档错误的元素内容中发现无效的 XML 字符 (Unicode: 0x0)

任何人都知道,如何在unicode 0x0 character使用 .xml 创建 xml 时从 XML 中删除boost property ptree

您的数据已嵌入 NUL 字节。实现这一目标的一种方法:

std::string const hazard("erm\0", 4); 
boost::property_tree::ptree pt;
pt.put("a.b.c.<xmlattr>.d", hazard);

更新

仔细检查后,XML根本不支持NUL 字节,句号(在 XML 中存储值 Null (ASCII))。

要么去掉有问题的字节,要么使用某种编码,比如 base64。


旧的分析和演示如下

请注意,属性树不是 XML 库,因此可能存在不符合 XML 标准的限制。

我仍然认为这是一个 BUG,因为它没有往返:属性树无法读回自己的序列化属性树:

Live On Coliru

#include <boost/property_tree/xml_parser.hpp>
#include <iostream>

int main() {
    std::string const hazard("erm\0", 4); 

    {
        std::ofstream ofs("NULbyte.xml");

        boost::property_tree::ptree pt;
        pt.put("a.b.c.<xmlattr>.d", hazard);

        write_xml(ofs, pt);
    }
    {
        std::ifstream ifs("NULbyte.xml");

        boost::property_tree::ptree pt;
        read_xml(ifs, pt);
        std::cout << (hazard == pt.get<std::string>("a.b.c.<xmlattr>.d")) << "\n";
    }
}

如果需要,您可以正确使用 JSON 后端: Live On Coliru

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章