推荐使用QXmlStreamReader和QXmlStreamWriter处理XML文件,二者为轻量级流式解析/生成器,支持逐标记读取、自动转义与标签配对,需手动处理空白、属性校验及文档起止,UTF-8编码开箱即用。

Qt 读写 XML 文件推荐用 QXmlStreamReader(读)和 QXmlStreamWriter(写),它们是 Qt 提供的基于事件流的轻量级、高效、内存友好的 XML 处理类,特别适合解析结构清晰或大型 XML 文件,不依赖 DOM 树,避免一次性加载全部内容到内存。
用 QXmlStreamReader 解析 XML 文件
它按“逐个标记(token)”方式顺序读取,类似 SAX 解析器。你需要自己判断当前读到的是开始标签、结束标签、文本内容还是注释等,并做相应处理。
- 先创建
QFile打开 XML 文件,再用该文件构造QXmlStreamReader - 用
readNext()移动到下一个标记,再通过tokenType()判断类型(如StartElement、Characters、EndElement) - 遇到
StartElement可用name()获取标签名,attributes()获取属性键值对 - 遇到
Characters时,用text().toString().trimmed()提取有效文本(注意过滤空白) - 建议配合 while 循环 + switch 判断 token 类型,结构清晰不易漏处理
常见解析逻辑示例(如读取 C++ Primer )
你可以这样组织代码逻辑:
- 读到
StartElement且 name()=="book" → 记录其 id 属性值 - 接着读到
StartElement且 name()=="title" → 设一个标志位(如inTitle = true) - 下一次读到
Characters且inTitle为真 → 保存文本内容 - 读到
EndElement且 name()=="title" → 清除标志位 - 读到
EndElement且 name()=="book" → 完成一条数据,存入容器或处理
用 QXmlStreamWriter 写入 XML 文件
它提供简洁的流式写接口,自动处理缩进(需手动设置)、转义、标签配对等细节。
- 用
setDevice()绑定QFile或QByteArray - 调用
writeStartDocument()开始,writeEndDocument()结束 - 用
writeStartElement("tag")写开始标签,writeAttribute("key", "value")写属性 - 用
writeCharacters("text")写文本内容,writeEndElement()写结束标签 - 如需格式化输出,可调用
setAutoFormatting(true)和setAutoFormattingIndent(2)
注意事项与避坑点
实际使用中容易忽略但关键的细节:
-
QXmlStreamReader不会自动跳过空白或换行,Characters可能返回空字符串或换行符,务必用trimmed()判断是否为空 - 读取属性前,确认当前 token 是
StartElement,否则attributes()返回空 - 写 XML 时,如果没调用
writeEndDocument(),可能缺少结尾换行或格式异常 - 中文内容无需额外编码设置 —— Qt 默认使用 UTF-8,只要源文件和 QFile 都是 UTF-8 编码即可正常读写
- 若 XML 嵌套深或结构复杂,建议封装成小函数按元素粒度解析(如 parseBook()、parseAuthor()),提升可读性和复用性










