1. 程式人生 > >Qt xml 讀寫之QXmlStreamReader

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();
}