Qt xml 讀寫之QXmlStreamReader
阿新 • • 發佈:2019-01-08
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();
}