boost property_tree XML序列化无法保留多行值及标签读取问题求解
解决方案
方案1:关闭trim_whitespace,手动修剪目标字段首尾空白
这是成本最低的适配方案,只需要在读取节点值后单独处理首尾空白,不会影响字符串内部的换行、空格格式:
- 解析XML时不添加
boost::property_tree::xml_parser::trim_whitespace参数,保留所有原始空白字符 - 读取到节点字符串后,仅修剪首尾的空白字符(空格、换行、制表符等),保留字符串中间的所有格式
- 示例代码:
#include <boost/algorithm/string/trim.hpp> #include <boost/property_tree/ptree.hpp> #include <boost/property_tree/xml_parser.hpp> // 读取节点逻辑 boost::property_tree::ptree pt; read_xml("your_file.xml", pt, boost::property_tree::xml_parser::no_comments); // 获取原始文本(包含首尾换行、空格) std::string raw_val = pt.get<std::string>("MyInfo"); // 仅修剪首尾空白,中间换行、空格全部保留 std::string processed_val = boost::algorithm::trim_copy(raw_val); // processed_val 此时就是需要的 "234"
- 对于其他需要保留多行格式的字段,直接使用原始的
raw_val即可,不需要做修剪操作。
方案2:调整XML结构,避免混合内容
示例里的<MyInfo>节点同时包含文本内容和子节点<My_Nums>,属于XML混合内容结构,本身就是boost property tree不擅长处理的场景。可以调整XML结构,把独立的文本值放到单独的标签里,比如:
<MyInfo id="info_1" title="" description="" > <My_Value>234</My_Value> <My_Nums> <My_Num>0</My_Num> <My_Num>1</My_Num> </My_Nums> </MyInfo>
调整后不管是否开启修剪参数,都可以直接读取<My_Value>的内容,不需要额外处理,也不会影响其他多行字段的格式。
方案3:换用专业XML解析库
boost property tree的XML解析能力本身是为了适配property tree的KV结构设计,天生不支持完美XML往返、不保留混合内容顺序、丢失格式信息是官方明确说明的固有特性。如果业务对XML格式完整性要求较高,建议直接换用TinyXML-2、libxml2等专门的XML处理库,可以完全规避这类限制。
内容的提问来源于stack exchange,提问作者TonySalimi
相关产品推荐
相关产品推荐

