为什么 boost 属性树 xml 序列化程序不能保留多行值?

问题描述

我正在使用 boost 属性树 (v.1.72.5) 来读取和写入 xml 文件。我知道根据the documentation

XML 存储编码不能完美地往返。一个读写 循环丢失修剪过的空白、低级格式信息,以及 普通数据节点和 CDATA 节点之间的区别。评论只是 启用时保留。写-读循环丢失修剪的空白; 也就是说,如果原始树具有以开头或结尾的字符串数据 空格,那个空格丢失了。

根据这个已知的行为,如果我读/写一个 xml 文件没有使用 boost::property_tree::xml_parser::trim_whitespace 选项,我的 xml 文件可以是这样的:

  <MyInfo id="info_1" title="" description="" >
     
     
     
     234
     <My_Nums>
        <My_Num>0</My_Num>
        <My_Num>1</My_Num>
     </My_Nums>
  </MyInfo>

在这种情况下,读取 MyInfo 的值(即 234)失败。但是如果我使用 boost::property_tree::xml_parser::trim_whitespace 选项,我可以正确读取值(即 234),但是我所有的多行字符串都转换为单行值(删除了换行符。)

如何正确读取 MyInfo 标记的值并同时保留多行值?

解决方法

正如@sehe 在评论中提到的,boost 属性树是如何实现的。我认为避免此问题的最佳解决方法是始终使用 boost::property_tree::xml_parser::trim_whitespace 属性并将值分配给特定标记。使用这种方法,我的 xml 文件将始终是这样的:

  <MyInfo id="info_1" title="" description="" >
     <value>234</value>
     <My_Nums>
        <My_Num>0</My_Num>
        <My_Num>1</My_Num>
     </My_Nums>
  </MyInfo>