Qt操作XML文档有很多方式,本文使用QXmlStreamWriter 、QXmlStreamReader类来进行XML文档的写入、读取。
使用XML模块,在.pro文件中添加QT += core xml
,并加如相应的头文件#include <QXmlStreamWriter>
或者 #include <QXmlStreamReader>
。
QXmlStreamWriter写入XMl文档:
常用的函数:
setCodec()
:设置编码encoding,修改默认的UTF-8格式
writeStartDocument()
:写文档头,作用类似于创建一个xml文档,并在文档开头部分写入版本信息和编码信息,默认为:
<?xml version="1.0" encoding="UTF-8"?>
writeEndDocument()
: 对应于writeStartDocument()
,当调用这个函数时,即表示文档信息写入完毕。
writeStartElement()
: 写入开始记号 比如
writeEndElement()
: 写入结束记号 比如
writeTextElement()
: 写入文本信息 比如下面的name,phone,age等等;
代码示例:
void xmlWrite()
{
QString str[]={
"Amy","Linda","Joan","icy"};
QString strTime[]={
"20220101","20220815","20221212","20230115"};
QFile file("./first.xml");
if(!file.open(QFile::WriteOnly|QFile::Text))
{
qDebug()<< "file cannot open";
return;
}
QXmlStreamWriter stream(&file);
stream.setAutoFormatting(true); //自动化格式,提高可读性
//这里可以分别设置编码、版本1.0。或者直接调用writeStartDocument()默认生成
//stream.setCodec("gb2312"); // 设置encoding="gb2312"
//stream.writeStartDocument("1.0", true); // 开始文档(XML 声明)
stream.writeStartDocument(); // 默认: <?xml version="1.0" encoding="UTF-8"?>
stream.writeStartElement("DATA");
for (int i = 0; i< 4; i++)
{
stream.writeStartElement("EMP");
stream.writeAttribute("Id", QString::number(i+1));
stream.writeAttribute("Time", strTime[i]);
stream.writeTextElement("name",str[i]);
stream.writeTextElement("phone","188XXXXXXXXXX");
stream.writeTextElement("age","30");
stream.writeEndElement();
}
stream.writeEndElement();
stream.writeEndDocument();
file.close();
}
XML文档效果:
<?xml version="1.0" encoding="UTF-8"?>
<DATA>
<EMP Id="1" Time="20220101">
<name>Amy</name>
<phone>188XXXXXXXXXX</phone>
<age>30</age>
</EMP>
<EMP Id="2" Time="20220815">
<name>Linda</name>
<phone>188XXXXXXXXXX</phone>
<age>30</age>
</EMP>
<EMP Id="3" Time="20221212">
<name>Joan</name>
<phone>188XXXXXXXXXX</phone>
<age>30</age>
</EMP>
<EMP Id="4" Time="20230115">
<name>icy</name>
<phone>188XXXXXXXXXX</phone>
<age>30</age>
</EMP>
</DATA>
QXmlStreamReader读取XMl文档:
常用的函数:
readNext()
:从xml输入流中读取下一个记号。
name()
:记号的名称,即<名称></名称>
isStartElement()
:判断当前已读取的记号是否为开始元素,开始元素即<>
isEndElement()
:判断当前已读取的记号是否为结束元素,结束元素即</>
readElementText()
:读取当前记号对应的文本值,<>文本值</>
atEnd()
:判断是否为文件结尾
代码示例:
void xmlRead()
{
QString str;
QFile file("./first.xml");
if(!file.open(QFile::ReadOnly|QFile::Text))
{
qDebug() << "Failed to open file"; //文件打开失败
return;
}
QXmlStreamReader reader(&file);
QXmlStreamReader::TokenType mtype = reader.readNext(); //读取下一个记号,并返回类型
if (QXmlStreamReader::StartDocument == mtype)
{
qDebug()<<"读取文件开始-"<<"版本号:"<<reader.documentVersion()<<"编码格式:"<<reader.documentEncoding();
}
while(!reader.atEnd())
{
if(reader.isStartElement())
{
QString STR = reader.name().toString();
if(reader.name() == "EMP")
{
QXmlStreamAttributes attributes = reader.attributes(); //获取元素的属性
if (attributes.hasAttribute("Id"))
{
qDebug() << attributes.value("Id"); //返回值是QStringRef,可以通过toString()转换成QString类型
}
if (attributes.hasAttribute("Time"))
{
qDebug() << attributes.value("Time");
}
}
else if (reader.name() == "name")
{
str = reader.readElementText();
qDebug() << str;
}
else if (reader.name() == "phone")
{
str = reader.readElementText();
qDebug() << str;
}
else if(reader.name() == "age" )
{
str = reader.readElementText();
qDebug() << str << endl;
}
}
else if (reader.isEndElement())
{
if(reader.name() == "EMP")
{
qDebug()<<endl;
}
}
mtype = reader.readNext();
}
file.close();
}
读取效果,控制台打印:
读取文件开始- 版本号: "1.0" 编码格式: "UTF-8"
"1"
"20220101"
"Amy"
"188XXXXXXXXXX"
"30"
"2"
"20220815"
"Linda"
"188XXXXXXXXXX"
"30"
"3"
"20221212"
"Joan"
"188XXXXXXXXXX"
"30"
"4"
"20230115"
"icy"
"188XXXXXXXXXX"
"30"
请按任意键继续. . .