QT读写XML文件(QXmlStreamWriter 与 QXmlStreamReader)

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"



请按任意键继续. . .

猜你喜欢

转载自blog.csdn.net/yulong_abc/article/details/128694809
今日推荐