文章目录
一、使用 QDomDocument操作节点
1.1 将信息写入XML文件中
#include <QDomDocument>
#include <QTextStream>
#include <QFile>
#include <QDir>
void writeXmlWithStreamWriter() {
QDomDocument document; // 创建对象
QDomProcessingInstruction version; // 写入XML头部(添加处理命令)
version = document.createProcessingInstruction("xml", "version = \"1.0\" encoding = \"utf8\"");
document.appendChild(version);
QDomElement root = document.createElement("Books");
document.appendChild(root);
// 模拟多个书
for (int i = 1; i <= 3; ++i) {
QDomElement book = document.createElement("Book");
book.setAttribute("id", QString::number(i));
QDomElement title = document.createElement("Title");
QDomText text = document.createTextNode(QString("Book Title %1").arg(i));
title.appendChild(text);
book.appendChild(title);
root.appendChild(book);
}
// 保存到文件
QDir dir(QCoreApplication::applicationDirPath());
QString strXmlPath = dir.absoluteFilePath("book_xml.xml");
QFile file(strXmlPath);
if (file.open(QIODevice::WriteOnly | QIODevice::Text)) {
QTextStream out(&file);
document.save(out, 4);
file.close();
}
}
输出结果:
<?xml version = "1.0" encoding = "utf8"?>
<Books>
<Book id="1">
<Title>Book Title 1</Title>
</Book>
<Book id="2">
<Title>Book Title 2</Title>
</Book>
<Book id="3">
<Title>Book Title 3</Title>
</Book>
</Books>
1.2.从XML文件中读取信息
#include <QDomDocument>
#include <QTextStream>
#include <QFile>
#include <QDir>
#include <QDebug>
void readXmlWithDom() {
// 保存到文件
QDir dir(QCoreApplication::applicationDirPath());
QString strXmlPath = dir.absoluteFilePath("book_xml.xml");
QFile file(strXmlPath);
if (!file.open(QIODevice::ReadOnly)) {
qDebug() << "Failed to open file";
return;
}
QDomDocument document;
if (!document.setContent(&file)) {
qDebug() << "Failed to parse XML";
file.close();
return;
}
file.close();
// 获取根节点
QDomElement root = document.documentElement();
if (root.tagName() != "Books") {
qDebug() << "Invalid root element";
return;
}
// 遍历所有 Book 节点
QDomNodeList books = root.elementsByTagName("Book");
for (int i = 0; i < books.count(); ++i) {
QDomElement book = books.at(i).toElement();
QString id = book.attribute("id");
QString title = book.firstChildElement("Title").text();
qDebug() << "Book id:" << id << ", title:" << title;
}
}
输出结果:
二、使用 QXmlStreamWriter操作节点
2.1 将信息写入XML文件中
#include <QXmlStreamWriter>
void writeMultipleBooks() {
QDir dir(QCoreApplication::applicationDirPath());
QString strXmlPath = dir.absoluteFilePath("book_xml.xml");
QFile file(strXmlPath);
if (!file.open(QIODevice::WriteOnly | QIODevice::Truncate)) {
qDebug() << "Failed to open file for writing.";
return;
}
QXmlStreamWriter xmlWriter(&file);
xmlWriter.setAutoFormatting(true); // 自动换行缩进
xmlWriter.writeStartDocument(); // 写XML头部 <?xml version="1.0" encoding="UTF-8"?>
xmlWriter.writeStartElement("Books"); // <Books>
// 写多个<Book>子节点
for (int i = 1; i <= 3; ++i) {
xmlWriter.writeStartElement("Book"); // <Book>
xmlWriter.writeAttribute("id", QString::number(i)); // 添加id属性
xmlWriter.writeTextElement("Title", QString("Book Title %1").arg(i)); // 写<Title>内容
xmlWriter.writeEndElement(); // </Book>
}
xmlWriter.writeEndElement(); // </Books>
xmlWriter.writeEndDocument(); // 自动结束
file.close();
}
输出结果:
<?xml version="1.0" encoding="UTF-8"?>
<Books>
<Book id="1">
<Title>Book Title 1</Title>
</Book>
<Book id="2">
<Title>Book Title 2</Title>
</Book>
<Book id="3">
<Title>Book Title 3</Title>
</Book>
</Books>
2.2 从XML文件中读取信息
#include <QXmlStreamReader>
void readMultipleBooks() {
QDir dir(QCoreApplication::applicationDirPath());
QString strXmlPath = dir.absoluteFilePath("book_xml.xml");
QFile file(strXmlPath);
if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
qDebug() << "Failed to open file.";
return;
}
QXmlStreamReader xmlReader(&file);
QString currentId;
QString currentTitle;
while (!xmlReader.atEnd()) {
xmlReader.readNext();
if (xmlReader.isStartElement()) {
if (xmlReader.name() == "Book") {
currentId = xmlReader.attributes().value("id").toString();
}
else if (xmlReader.name() == "Title") {
currentTitle = xmlReader.readElementText();
qDebug() << "Book ID:" << currentId << "Title:" << currentTitle;
}
}
}
if (xmlReader.hasError()) {
qDebug() << "XML parse error:" << xmlReader.errorString();
}
file.close();
}
输出结果:
解析过程详解:
- readNext() ➔ 读取下一个XML记号(元素开始、元素结束、文本等)
- isStartElement() ➔ 检查是不是开始的标签 <…>
- xmlReader.name() ➔ 得到当前节点名字
- xmlReader.attributes().value(“xxx”) ➔ 读取节点的属性,比如 <Book id=“1”>
- xmlReader.readElementText() ➔ 读取节点内的文本,比如 <Title>xxx
三、总结
QDomDocument 和 QXmlStreamWriter/Reader 的最大区别在于:
举个具体场景对比
用 QDomDocument ➔ 适合做:
- 需要随时修改某个节点
- 比如:读取配置文件,动态增加配置项,保存回去
- 编辑复杂XML(像HTML编辑器)
用 QXmlStreamReader/Writer ➔ 适合做:
- 只需要快速读一遍提取数据
- 需要生成超大XML(比如100MB+的数据导出)
- 不需要修改,只需要一条条处理