Boost 属性 ptree:boost write_xml 在 xml 文件的子元素中添加 unicode 0x0 字符
Boost Property ptree: boost write_xml adding unicode 0x0 character in child element in xml file
我正在使用 boost write_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 副应用程序,并且 Java 在解析 boost 创建时抛出以下异常错误 xml。
An Invalid XML character(Unicode: 0x0) was found in the element content of the document error
任何人都知道如何在使用 boost property ptree
.
创建 xml 时从 XML 中删除 unicode 0x0 character
您的数据中嵌入了 NUL 字节。实现此目的的一种方法:
std::string const hazard("erm[=10=]", 4);
boost::property_tree::ptree pt;
pt.put("a.b.c.<xmlattr>.d", hazard);
更新
仔细检查后,NUL 字节只是不支持 XML,句号(Storing the value Null (ASCII) in XML).
要么去掉有问题的字节,要么使用某种编码,比如 base64。
旧的分析和论证如下
请注意,属性 Tree 不是 XML 库,因此可能存在不符合 XML 标准的限制。
我仍然认为这是一个 BUG,因为它没有往返:属性 树无法读取自己的序列化 属性 树返回:
#include <boost/property_tree/xml_parser.hpp>
#include <iostream>
int main() {
std::string const hazard("erm[=11=]", 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
我正在使用 boost write_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 副应用程序,并且 Java 在解析 boost 创建时抛出以下异常错误 xml。
An Invalid XML character(Unicode: 0x0) was found in the element content of the document error
任何人都知道如何在使用 boost property ptree
.
unicode 0x0 character
您的数据中嵌入了 NUL 字节。实现此目的的一种方法:
std::string const hazard("erm[=10=]", 4);
boost::property_tree::ptree pt;
pt.put("a.b.c.<xmlattr>.d", hazard);
更新
仔细检查后,NUL 字节只是不支持 XML,句号(Storing the value Null (ASCII) in XML).
要么去掉有问题的字节,要么使用某种编码,比如 base64。
旧的分析和论证如下
请注意,属性 Tree 不是 XML 库,因此可能存在不符合 XML 标准的限制。
我仍然认为这是一个 BUG,因为它没有往返:属性 树无法读取自己的序列化 属性 树返回:
#include <boost/property_tree/xml_parser.hpp>
#include <iostream>
int main() {
std::string const hazard("erm[=11=]", 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