上次随便写了些关于Qt5的事件与处理,没想到还会有人看,所以这次就认真写了一篇关于Qt中的XML文件处理的文章,如有知识上的错误还望大家指点~
·XML文件的存放
·XML文件的解析
·XML文件信息的查询
·XML文件的存放
XML文件的存放对知道的人来说简单,但是对没用过Qt的人来说放错地方了那可真是要命,直接会导致从一开始文件就读取错误。
XML文件与头文件、源文件不同,而是放在对应的debug文件夹或release文件夹内
·XML文件的解析
文件的解析依然是那些老套路
- QFile *file;
- file = new QFile("attribs.xml"); //关联attrib.xml文件
void MainWindow::ReadFile() //读取文件
- {
- if(!file->open(QIODevice::ReadOnly)) //以只读的方式打开文件
- {
- return;
- }
- { //This function parses the XML document from the byte array data and sets it as the content of the document.
- file->close();
- return;
- }
- file->close();
- }
setContent()返回解析结果,结果为bool值,解析成功后会返回true,否则返回false
·XML文件信息的查询
- <?xml version="1.0" encoding="UTF-8"?>
- <archive>
- <car id="1" >
- <attrib number="01" >排量:2393ml</attrib>
- <attrib number="02" >价格:43.26万元</attrib>
- <attrib number="03" >排放:欧 4</attrib>
- <attrib number="04" >油耗:7.01(90km/h) 8.31(120km/h)</attrib>
- <attrib number="05" >功率:130/6000</attrib>
- </car>
- <car id="2" >
- <attrib number="01" >排量:1600ml</attrib>
- <attrib number="02" >价格:8.26万元</attrib>
- <attrib number="03" >排放:欧 3</attrib>
- <attrib number="04" >油耗:6.11(90km/h)</attrib>
- <attrib number="05" >功率:68/5800</attrib>
- </car>
- </archive>
- ·搜寻节点
void MainWindow::showDetail() //搜寻节点{
QDomNodeList cars = filedata.elementsByTagName("car"); //查找所有"car"元素节点,返回QDomNodeList实例 //检测节点数用 //int textNumber = cars.count(); QString ID("2"); for(int i = 0; i < cars.count(); i++) //遍历节点 { QDomNode car = cars.item(i); QString test(car.toElement().attribute("id")); //toElement()函数将QDomNode转化为QDomElement,attribute("id")查找id属性,返回值为QString if(car.toElement().attribute("id") == ID) //这里的ID是检验用的,来匹配元素节点中id对应为ID的节点(可调整) { getAttribList(car); //得到节点后进一步查询信息 break; } }}
- ·获取信息
- void MainWindow::getAttribList(QDomNode &car) //获取信息
- {
- QDomNodeList nodes = car.childNodes(); //childNodes()返回节点的子节点集合,返回值为QDomNodeList实例
- QDomNode node;
- QString getNumber;
- for(int i = 0; i < nodes.count(); i++) //以QDomNodeList的nodes的子节点数来遍历子节点提取需要的信息
- {
- node = nodes.item(i);
- getNumber = node.toElement().attribute("number"); //获取子节点的number属性对应信息
- QString infor(getNumber+" "+node.toElement().text()); //node.toElement().text()对应节点元素文本
- QMessageBox::about(this,"infor",infor);
- }
- }
- //下面是源码(xml文件用上面的就可以了):
- //mainwindow.h
- #ifndef MAINWINDOW_H
- #define MAINWINDOW_H
- #include <QMainWindow>
- #include <QFile>
- #include <QDomDocument>
- #include <QDomNode>
- #include <QMessageBox>
- #include <QDomNodeList>
- class MainWindow : public QMainWindow
- {
- Q_OBJECT
- public:
- MainWindow(QWidget *parent = 0);
- QFile *file;
- QDomDocument filedata;
- void showDetail();
- void ReadFile();
- void getAttribList(QDomNode &car);
- ~MainWindow();
- };
- #endif // MAINWINDOW_H
- #include "mainwindow.h"
- MainWindow::MainWindow(QWidget *parent)
- : QMainWindow(parent)
- {
- file = new QFile("attribs.xml"); //关联attrib.xml文件
- ReadFile();
- showDetail();
- }
- void MainWindow::showDetail() //搜寻节点
- {
- QDomNodeList cars = filedata.elementsByTagName("car"); //查找所有"car"元素节点,返回QDomNodeList实例
- //检测节点数用
- //int textNumber = cars.count();
- QString ID("2");
- for(int i = 0; i < cars.count(); i++) //遍历节点
- {
- QDomNode car = cars.item(i);
- QString test(car.toElement().attribute("id")); //toElement()函数将QDomNode转化为QDomElement,attribute("id")查找id属性,返回值为QString
- if(car.toElement().attribute("id") == ID) //这里的ID是检验用的,来匹配元素节点中id对应为ID的节点(可调整)
- {
- getAttribList(car); //得到节点后进一步查询信息
- break;
- }
- }
- }
- void MainWindow::getAttribList(QDomNode &car) //获取信息
- {
- QDomNodeList nodes = car.childNodes(); //childNodes()返回节点的子节点集合,返回值为QDomNodeList实例
- QDomNode node;
- QString getNumber;
- for(int i = 0; i < nodes.count(); i++) //以QDomNodeList的nodes的子节点数来遍历子节点提取需要的信息
- {
- node = nodes.item(i);
- getNumber = node.toElement().attribute("number"); //获取子节点的number属性对应信息
- QString infor(getNumber+" "+node.toElement().text()); //node.toElement().text()对应节点元素文本
- QMessageBox::about(this,infor);
- }
- }
- void MainWindow::ReadFile()
- {
- if(!file->open(QIODevice::ReadOnly)) //以只读的方式打开文件
- {
- return;
- }
- if(!filedata.setContent(file)) //解析XML文件并设置为filedata的内容
- { //This function parses the XML document from the byte array data and sets it as the content of the document.
- file->close();
- return;
- }
- file->close();
- }
- MainWindow::~MainWindow()
- {
- }