使用boost::property_tree编写CDATA XML节点
Write CDATA XML-node with boost::property_tree
我正在尝试使用boost::property_tree编写一个包含CDATA节点的XML文件。但是,由于<
、>
、&
等字符在写入XML文件时会自动转义,因此类似
xml.put("node", "<![CDATA[message]]>")
将显示为
<node><![CDATA[message]]></node>
在XML文件中。是否有任何方法可以使用property_tree正确写入CDATA节点,或者这只是库的限制?
Boost文档明确指出,它无法区分CDATA和非CDATA值:
XML存储编码不能完美地往返。读写循环会丢失修剪后的空白、低级格式化信息以及正常数据和CDATA节点之间的区别。注释仅在启用时保留。写-读循环会丢失修剪后的空白;也就是说,如果原始树的字符串数据以空白开始或结束,则该空白将丢失。
我遇到过同样问题的几次都是在非常特定的情况下,我知道不需要其他转义数据,所以对生成的文件进行简单的后处理以替换转义字符就足够了。
举个一般的例子:
std::ostringstream ss;
pt::write_xml(ss, xml, pt::xml_writer_make_settings<std::string>('t', 1));
auto cleaned_xml = boost::replace_all_copy(ss.str(), ">", ">");
cleaned_xml = boost::replace_all_copy(cleaned_xml, "<", "<");
cleaned_xml = boost::replace_all_copy(cleaned_xml, "&", "&"); // last one
std::ofstream fo(path);
fo << cleaned_xml;
更详细的解决方案应该包括找到打开的<![CDATA[
和关闭的]]>
,并仅在这些限制范围内进行替换,以避免替换正确转义的符号。
这个答案中提供了另一个解决方案,但我从未使用过
相关文章:
- Cppcheck生成xml转储文件
- 如何在pugixml中获取节点的内部XML
- 如何使用tinyxml2从XML加载父实体和子实体
- boost xml parsingl将xml的路径作为变量发送
- C++RapidXml-使用first_node()遍历以修改XML文件中节点的值
- 使用 Tinyxml 在 xml 中添加一个子子项
- 增强基于 XML class_id的反序列化
- 在 c++ 中使用 vtd-xml 时,如何摆脱 EOFException?
- 防止在C++中选择错误文件时提升 xml 解析器崩溃
- c++ 读取 xml 文件的内容
- 删除 XML 文件中的子节点C++
- 使用 RapidXML 更新C++中的 XML 节点和属性值
- 在Cmake构建CmakeList.txt中读取/解析XML文件
- 从 XML 中读取未指定结构的每个数据成员
- XML to XML XSLT transformation. MSXML in VBScript
- 将 QGraphicsView 或 Scene 转换为 XML/JSON
- Qt 写入 xml: QIODevice::write (QFile, "D:/logs.xml" ): 设备未打开
- 使用 libxml2 解析 XML 文件时缺少元素值
- 使用boost::property_tree编写CDATA XML节点
- XML从UnicodeString创建CData节点时出现无效字符