You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.15 20:24:06