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