Qt xml 读写之QXmlStreamReader

qt 处理 xml主要有两个方式  QXmlStreamReader 和QDomDocument

本文简绍 QXmlStreamReader 的读与写;并给出测试过的代码和xml;

一个xml文件的一般格式:<quote> Aquotion</quote>。元素中可以插入属性,但是属性值一定要用双引号。

读取xml文件

第一步 打开文件

QString dpath = QDir::currentPath() + "/Data/Position.xml";
	QFile file(dpath);
	if (!file.open(QFile::ReadOnly | QFile::Text)) {
		std::cerr << "Error: Cannot read file " << qPrintable(dpath)
			<< ": " << qPrintable(file.errorString())
			<< std::endl;
	}

第二步 根据文件获取QXmlStreamReader

QXmlStreamReader reader(&file);

第三步 读取每一个元素;根据元素来获取名字和属性等;

while (!reader.atEnd()) {
		reader.readNext();
		if (reader.isStartElement()) {
			
			if (reader.name() == "Speed")
			{
				speed_1 = reader.attributes().value("speed_1").toInt();
				// qDebug() << reader.readElementText();
			}

			// qDebug() << reader.name() << reader.attributes().value("speed_zong").toInt();
		}
	}

第四步 关闭文件

	file.close();
	if (reader.hasError()) {
		std::cerr << "Error: Failed to parse file "
			<< qPrintable(dpath) << ": "
			<< qPrintable(reader.errorString()) << std::endl;
	}
	else if (file.error() != QFile::NoError) {
		std::cerr << "Error: Cannot read file " << qPrintable(dpath)
			<< ": " << qPrintable(file.errorString())
			<< std::endl;
	}

5 全部代码与文件

<转盘>
    <位置>
        <Position Posb="24681" Posa="2997" Pos="16070"/>
		 <Position Posb="24681" Posa="2997" Pos="16070"/>
    </位置>
    <速度>
        <Speed  speed_1="43672"/>
    </速度>
    <相机电磁阀点>
	    <Out IO="21"/>
		<Out IO="22"/>
		<Out IO="23"/>
        <Out IO="1"/>
        <Out IO="2"/>
    </相机电磁阀点>
    <相机数量>
        <camera Count="1"/>
    </相机数量>
    <电磁阀数量>
        <valve Count="2"/>
    </电磁阀数量>
</转盘>
void DateHelper::readSpeed()
{
	QString dpath = QDir::currentPath() + "/Data/Position.xml";
	QFile file(dpath);
	if (!file.open(QFile::ReadOnly | QFile::Text)) {
		std::cerr << "Error: Cannot read file " << qPrintable(dpath)
			<< ": " << qPrintable(file.errorString())
			<< std::endl;
	}
	QXmlStreamReader reader(&file);
	while (!reader.atEnd()) {
		reader.readNext();
		if (reader.isStartElement()) {
			
			if (reader.name() == "Speed")
			{
				speed_1 = reader.attributes().value("speed_1").toInt();
				// qDebug() << reader.readElementText();
			}

			// qDebug() << reader.name() << reader.attributes().value("speed_zong").toInt();
		}
	}
	file.close();
	if (reader.hasError()) {
		std::cerr << "Error: Failed to parse file "
			<< qPrintable(dpath) << ": "
			<< qPrintable(reader.errorString()) << std::endl;
	}
	else if (file.error() != QFile::NoError) {
		std::cerr << "Error: Cannot read file " << qPrintable(dpath)
			<< ": " << qPrintable(file.errorString())
			<< std::endl;
	}
}

保存xml文件

第一步,第二步和前文类似

	QString dpath = QDir::currentPath()+ "/Product.xml";
	QFile file(dpath);
	file.open(QIODevice::WriteOnly);
	//QXmlStreamWriter xmlWriter(&file);
	QXmlStreamWriter writer(&file);

第三步    格式说明

	writer.setAutoFormatting(true);//自动化格式
		writer.writeStartDocument("1.0", true); //开始文档(xml声明)

第四步 开始文档

writer.writeStartDocument("1.0", true); //开始文档(xml声明)

第五步 开始根元素

	writer.writeStartElement("root");//开始根元素

第六步 主要的数据保存

	int row = model->rowCount();
	for (int j = 0; j < row; j++)
	{

		writer.writeStartElement("config");//开始子元素
		writer.writeAttribute("id", "iddd");
		for (int i = 0; i < header.size(); i++)
		{
			QModelIndex ind = model->index(j, i);
			writer.writeTextElement(header.at(i), model->data(ind).toString());
		}
		writer.writeEndElement();//结束子元素
	}

第七步 结束根元素,文档

	writer.writeEndElement();//结束根元素
	writer.writeEndDocument();//结束文档

第八步 结束文件

file.close();

全部代码和xml (从table内获取数据并保存到xml)


<root>
    <config id="iddd">
        <CCD>CCD1</CCD>
        <检测项>111</检测项>
        <上限>qq</上限>
        <下限></下限>
        <测量></测量>
        <OKorNG></OKorNG>
        <良率></良率>
    </config>
    <config id="iddd">
        <CCD>2009441676</CCD>
        <检测项>2009441676</检测项>
        <上限>2009441676</上限>
        <下限>2009441676</下限>
        <测量>2009441676</测量>
        <OKorNG>2009441676</OKorNG>
        <良率>2009441676</良率>
    </config>
    <config id="iddd">
        <CCD></CCD>
        <检测项></检测项>
        <上限></上限>
        <下限></下限>
        <测量></测量>
        <OKorNG></OKorNG>
        <良率></良率>
    </config>
</root>
void CameraDtecte1::savegird()
{
	QString dpath = PathHelper::currentproductpath + "/Product.xml";
	//QString dpath = QDir::currentPath()+ "/Product.xml";
	QFile file(dpath);
	file.open(QIODevice::WriteOnly);
	//QXmlStreamWriter xmlWriter(&file);
	QXmlStreamWriter writer(&file);
	writer.setAutoFormatting(true);//自动化格式
	//	writer.writeStartDocument("1.0", true); //开始文档(xml声明)
	writer.writeStartElement("root");//开始根元素
	int row = model->rowCount();
	for (int j = 0; j < row; j++)
	{

		writer.writeStartElement("config");//开始子元素
		writer.writeAttribute("id", "iddd");
		for (int i = 0; i < header.size(); i++)
		{
			QModelIndex ind = model->index(j, i);
			writer.writeTextElement(header.at(i), model->data(ind).toString());
		}
		writer.writeEndElement();//结束子元素
	}

	writer.writeEndElement();//结束根元素
	writer.writeEndDocument();//结束文档

	file.close();
}

猜你喜欢

转载自blog.csdn.net/U201414786/article/details/85341522
今日推荐