推荐使用QXmlStreamReader和QXmlStreamWriter处理XML文件,二者为轻量级流式解析/生成器,支持逐标记读取、自动转义与标签配对,需手动处理空白、属性校验及文档起止,UTF-8编码开箱即用。
Qt 读写 XML 文件推荐用 QXmlStreamReader(读)和 QXmlStreamWriter(写),它们是 Qt 提供的基于事件流的轻量级、高效、内存友好的 XML 处理类,特别适合解析结构清晰或大型 XML 文件,不依赖 DOM 树,避免一次性加载全部内容到内存。
它按“逐个标记(token)”方式顺序读取,类似 SAX 解析器。你需要自己判断当前读到的是开始标签、结束标签、文本内容还是注释等,并做相应处理。
QFile 打开 XML 文件,再用该文件构造 QXmlStreamReader
readNext() 移动到下一个标记,再通过 tokenType() 判断类型(如 StartElement、Characters、EndElement)StartElement 可用 name() 获取标签名,attributes() 获取属性键值对
Characters 时,用 text().toString().trimmed() 提取有效文本(注意过滤空白)你可以这样组织代码逻辑:
StartElement 且 name()=="book" → 记录其 id 属性值StartElement 且 name()=="title" → 设一个标志位(如 inTitle = true)Characters 且 inTitle 为真 → 保存文本内容EndElement 且 name()=="title" → 清除标志位EndElement 且 name()=="book" → 完成一条数据,存入容器或处理它提供简洁的流式写接口,自动处理缩进(需手动设置)、转义、标签配对等细节。
setDevice() 绑定 QFile 或 QByteArray
writeStartDocument() 开始,writeEndDocument() 结束writeStartElement("tag") 写开始标签,writeAttribute("key", "value") 写属性writeCharacters("text") 写文本内容,writeEndElement() 写结束标签setAutoFormatting(true) 和 setAutoFormattingIndent(2)
实际使用中容易忽略但关键的细节:
QXmlStreamReader 不会自动跳过空白或换行,Characters 可能返回空字符串或换行符,务必用 trimmed() 判断是否为空StartElement,否则 attributes()
writeEndDocument(),可能缺少结尾换行或格式异常