0

0

C++ Boost库解析XML Boost.PropertyTree读写XML指南

煙雲

煙雲

发布时间:2026-03-13 10:50:31

|

774人浏览过

|

来源于php中文网

原创

Boost.PropertyTree的write_xml()默认不格式化XML,输出无换行缩进;需显式传xml_writer_settings控制格式,注意UTF-8编码与BOM问题,且不支持大文件和复杂XML特性。

c++ boost库解析xml boost.propertytree读写xml指南

为什么 write_xml() 生成的 XML 没有换行和缩进?

默认不格式化,这是 Boost.PropertyTree 最常被吐槽的一点。它把 XML 当作纯数据序列化工具用,不是为了人眼可读。

实操上必须显式传入 xml_writer_settings,否则输出是单行、无缩进、属性顺序随机的紧凑格式:

ptree pt; pt.put("root.child", "value"); write_xml("out.xml", pt); // → <root><child>value</child></root>
  • 加缩进:传入 xml_writer_settings<std::string>(" ", 1)(4空格 + 换行)
  • 避免中文乱码:确保 ptree 中字符串是 UTF-8 编码,且写入时用 std::locale::global(std::locale("")) 或显式指定 UTF-8 facet(Windows 下尤其关键)
  • 注意:write_xml() 默认会写 <?xml version="1.0" encoding="utf-8"?> 声明,但不会校验内容是否真为 UTF-8

read_xml() 报错 xml_parser_error 怎么定位?

这个错误信息极简,只告诉你“解析失败”,不告诉你哪一行、什么标签出问题。常见于 XML 格式不规范或编码不匹配。

调试建议优先做三件事:

立即学习C++免费学习笔记(深入)”;

  • 用外部工具(如 xmllint --noout file.xml)先验证 XML 合法性;PropertyTree 不支持 DTD、命名空间、CDATA 块,遇到就崩
  • 检查 BOM:UTF-8 文件带 BOM 时,read_xml() 会把 BOM 当作非法字符报错;用 xxd file.xml | head 看开头是不是 ef bb bf
  • 临时改用 read_xml() 的重载版本,传入 boost::property_tree::xml_parser::trim_whitespaceboost::property_tree::xml_parser::no_concat_text 减少预处理干扰

怎么保留 XML 属性和文本混排(比如 <tag attr="x">text</tag>)?

Boost.PropertyTree 天然不区分“元素内容”和“属性”,它把所有东西都映射成键值对树。默认行为会把文本内容塞进一个叫 <xmlattr></xmlattr> 的伪节点下,而真实文本内容放在同级的 <xmltext></xmltext> 节点里 —— 这个设计反直觉,但必须接受。

Mokker AI
Mokker AI

AI产品图添加背景

下载

例如这段 XML:

<item id="123">hello</item>

会被解析成:

item.<xmlattr>.id = "123"
item.<xmltext> = "hello"
  • 写入时也得按这个结构组织 ptree,不能直接 pt.put("item", "hello"),否则属性会丢
  • 想读取属性:用 pt.get_child("item.<xmlattr>").get_value("id")</xmlattr>
  • 想读取文本:用 pt.get_child("item.<xmltext>").get_value("")</xmltext>(注意 fallback 值要给空字符串,否则可能抛异常)
  • 别手动生成 <xmlattr></xmlattr> 节点名:它是硬编码的,大小写敏感,拼错就查不到

ptree 处理大 XML 文件会卡死或爆内存吗?

会。PropertyTree 是全内存加载模型,没有流式解析能力。一个 50MB 的 XML 文件很可能吃掉 200MB+ 内存,且解析时间非线性增长。

这不是 bug,是设计限制 —— 它本就不是为大数据 XML 设计的。

  • 如果文件 > 1MB,优先考虑 libxml2pugixml;PropertyTree 只适合配置文件、小数据交换
  • 即使小文件,也要防意外:用 try/catch 包住 read_xml(),因为解析失败时异常类型是 boost::property_tree::xml_parser::xml_parser_error,不是标准 std::exception
  • 释放内存:ptree 析构会清空,但若中间做了大量 put()add(),树深度过大,递归析构可能栈溢出(少见但存在)

真正麻烦的是混合场景:既要读写简单配置,又偶尔要啃几 MB 的 XML 日志。这时候别硬扛,该切库就切库,PropertyTree 的边界比很多人想的窄得多。

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

1031

2023.08.02

pdf怎么转换成xml格式
pdf怎么转换成xml格式

将 pdf 转换为 xml 的方法:1. 使用在线转换器;2. 使用桌面软件(如 adobe acrobat、itext);3. 使用命令行工具(如 pdftoxml)。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1948

2024.04.01

xml怎么变成word
xml怎么变成word

步骤:1. 导入 xml 文件;2. 选择 xml 结构;3. 映射 xml 元素到 word 元素;4. 生成 word 文档。提示:确保 xml 文件结构良好,并预览 word 文档以验证转换是否成功。想了解更多xml的相关内容,可以阅读本专题下面的文章。

2119

2024.08.01

xml是什么格式的文件
xml是什么格式的文件

xml是一种纯文本格式的文件。xml指的是可扩展标记语言,标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言。想了解更多相关的内容,可阅读本专题下面的相关文章。

1171

2024.11.28

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

760

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

221

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1567

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

650

2023.11.24

TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

1

2026.03.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号