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"



请按任意键继续. . .
  • 2
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值