首先我们来介绍一下Qt读写XML文件的基本概念。XML(Extensible Markup Language)是一种标记语言,作为一种通用性的标记语言,被广泛应用于存储和传输数据。Qt中提供了用于读写XML文件的模块QXmlStreamReader和QXmlStreamWriter。
一、QXmlStreamReader介绍
QXmlStreamReader是Qt中的一种用于读取XML文档的解析器,可以用来读取XML文件或者字符串。
1.1 基本语法
QXmlStreamReader reader(&file);// or QXmlStreamReader reader(xml_str)
while(!reader.atEnd() && !reader.hasError())
{
QXmlStreamReader::TokenType token = reader.readNext();
if(token == QXmlStreamReader::StartDocument) {
// 开始读取XML文档
} else if (token == QXmlStreamReader::StartElement) {
// 开始读取元素
QString name = reader.name().toString(); // 元素名字
QXmlStreamAttributes attributes = reader.attributes(); // 所有属性
// do something
} else if (token == QXmlStreamReader::EndElement) {
// 结束读取元素
// do something
} else if (token == QXmlStreamReader::Characters) {
// 读取元素内容
QString text = reader.text().toString(); // 元素内容
}
}
1.2 示例:读取XML文件
例如,我们有以下example.xml文件:
<?xml version="1.0" encoding="UTF-8"?>
<students>
<student id="1001">
<name>Tom</name>
<score>85</score>
</student>
<student id="1002">
<name>Lucy</name>
<score>90</score>
</student>
</students>
那么我们可以对其进行读取:
QFile file("example.xml");
if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
{
qDebug() << "Open file error";
return;
}
QXmlStreamReader reader(&file);
while (!reader.atEnd())
{
if (reader.tokenType() == QXmlStreamReader::StartElement)
{
if (reader.name() == "student")
{
int id = reader.attributes().value("id").toInt();
qDebug() << "id:" << id;
}
else if (reader.name() == "name")
{
QString name = reader.readElementText();
qDebug() << "name:" << name;
}
else if (reader.name() == "score")
{
QString score = reader.readElementText();
qDebug() << "score:" << score;
}
}
reader.readNext();
}
file.close();
1.3 示例:读取XML字符串
如果需要读取XML字符串,那么只需要调用QXmlStreamReader的构造函数即可:
QString xml_str = "<students>\
<student id=\"1001\">\
<name>Tom</name>\
<score>85</score>\
</student>\
<student id=\"1002\">\
<name>Lucy</name>\
<score>90</score>\
</student>\
</students>";
QXmlStreamReader reader(xml_str);
while (!reader.atEnd())
{
if (reader.tokenType() == QXmlStreamReader::StartElement)
{
if (reader.name() == "student")
{
int id = reader.attributes().value("id").toInt();
qDebug() << "id:" << id;
}
else if (reader.name() == "name")
{
QString name = reader.readElementText();
qDebug() << "name:" << name;
}
else if (reader.name() == "score")
{
QString score = reader.readElementText();
qDebug() << "score:" << score;
}
}
reader.readNext();
}
二、QXmlStreamWriter介绍
QXmlStreamWriter是Qt中的一种用于写入XML文件的解析器,可以用来写入XML文件或者字符串。
2.1 基本语法
QFile file("example.xml"); // or QIODevice *device
QXmlStreamWriter writer(&file); // or QXmlStreamWriter writer(device)
writer.setAutoFormatting(true); // 是否自动缩进
writer.writeStartDocument(); // 写入XML头
writer.writeStartElement("students");// 开始写入元素
writer.writeAttribute("version", "1.0");// 写入属性
writer.writeTextElement("stu1", "Tom");
writer.writeTextElement("stu2", "Lucy");
writer.writeEndElement(); // 结束写入元素
writer.writeEndDocument(); // 结束写入XML文件
file.close();
2.2 示例:写入XML文件
我们可以将上面读取的example.xml文件进行修改并保存:
QFile file("students.xml");
if (!file.open(QIODevice::WriteOnly | QIODevice::Text))
{
qDebug() << "Open file error";
return;
}
QXmlStreamWriter writer(&file);
writer.setAutoFormatting(true); // 自动缩进
writer.writeStartDocument(); // 写入XML头
writer.writeStartElement("students");
writer.writeStartElement("student");
writer.writeAttribute("id", "1001");
writer.writeTextElement("name", "Tom");
writer.writeTextElement("score", "85");
writer.writeEndElement();
writer.writeStartElement("student");
writer.writeAttribute("id", "1002");
writer.writeTextElement("name", "Lucy");
writer.writeTextElement("score", "90");
writer.writeEndElement();
writer.writeEndElement();
writer.writeEndDocument();
file.close();
执行上述代码后将会在本地生成students.xml文件,内容与example.xml文件相同。
2.3 示例:写入XML字符串
如果需要将写好的XML文件直接以字符串形式输出,那么可以使用QString作为中介:
QString xml_str;
QXmlStreamWriter writer(&xml_str);
writer.setAutoFormatting(true); // 自动缩进
writer.writeStartDocument(); // 写入XML头
writer.writeStartElement("students");
writer.writeStartElement("student");
writer.writeAttribute("id", "1001");
writer.writeTextElement("name", "Tom");
writer.writeTextElement("score", "85");
writer.writeEndElement();
writer.writeStartElement("student");
writer.writeAttribute("id", "1002");
writer.writeTextElement("name", "Lucy");
writer.writeTextElement("score", "90");
writer.writeEndElement();
writer.writeEndElement();
writer.writeEndDocument();
qDebug() << xml_str;
执行上述代码后将会输出生成的XML字符串:
<?xml version="1.0" encoding="UTF-8"?>
<students>
<student id="1001">
<name>Tom</name>
<score>85</score>
</student>
<student id="1002">
<name>Lucy</name>
<score>90</score>
</student>
</students>
以上就是关于Qt读写XML文件的方法详解。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Qt读写XML文件的方法详解(含源码+注释) - Python技术站