推荐使用QXmlStreamReader和QXmlStreamWriter处理XML:前者基于事件流、内存友好,适合大文件解析;后者按需生成、自动转义缩进,写入简洁安全。

Qt 处理 XML 文件推荐用 QXmlStreamReader(读)和 QXmlStreamWriter(写),它们是基于事件流的轻量级、高效、内存友好的方案,比 DOM(QDomDocument)更适合大文件或性能敏感场景。
QXmlStreamReader:边读边解析,不加载整个文档
适合解析结构清晰、顺序固定的 XML,比如配置文件、日志、简单数据交换格式。它逐个读取“令牌”(token),如开始标签、文本内容、结束标签等,你需要自己维护上下文状态。
- 创建后调用
readNext()推进到下一个元素,再用tokenType()判断类型(StartElement、Characters、EndElement等) - 遇到
StartElement可用name()获取标签名,attributes()拿属性列表 - 遇到
Characters时用text().toString()提取文本内容(注意可能含空白或换行,建议用isWhitespace()过滤) - 支持嵌套层级判断:用
depth()或手动计数(如进入时 ++,退出时 --)
QXmlStreamWriter:按需生成格式化 XML
写 XML 更简单直观——你控制输出顺序,它负责转义、缩进和语法正确性。
- 构造时传入
QTextStream(可绑定 QFile 或 QByteArray),自动处理编码(默认 UTF-8) - 常用方法:
writeStartDocument()→writeStartElement("tag")→writeAttribute("key", "value")→writeCharacters("text")→writeEndElement()→writeEndDocument() - 启用自动缩进:调用
setAutoFormatting(true),再设setAutoFormattingIndent(2) - 中文等 Unicode 内容无需额外处理,只要 QTextStream 编码设置正确(通常默认 OK)
实用小技巧与避坑点
实际用的时候容易卡在几个细节上:
- 读取前确认文件打开成功且
QFile::open(QIODevice::ReadOnly)返回 true;写入前确保目录存在、文件可写 -
QXmlStreamReader不自动跳过注释/处理指令,默认会读到Comment或ProcessingInstruction类型,不需要就加判断跳过 - 读取属性值推荐用
attributes().value("attrName").toString(),避免空指针;写入前可用QString::isEmpty()防空字符串写入 - 如果 XML 有 DTD 或命名空间,
QXmlStreamReader默认不验证也不展开,够用;需要验证请换QXmlSchema+QXmlSchemaValidator
一个最小可运行读写示例
比如处理如下片段:
- 读:遇到
就取port属性和中间文本;用readNextStartElement()可简化嵌套逻辑 - 写:先
writeStartDocument(),再writeStartElement("config"),嵌套写host并设属性、写文本,最后收尾 - 全程不用 new/delete,栈对象即可,Qt 自动管理底层资源
基本上就这些。不复杂但容易忽略缩进、编码、空格处理这些细节。用熟了,比手拼字符串或硬啃 DOM 快得多也稳得多。










