XML是类似HTML的WEB前端标识符语言,这个比较简单,大家可以去学习一下,HTML+CSS+JS可以做一个非常不错的网站,我个人网站就是用这个框架开发的,也可以用JSP或PHP去开发,这里我们的重点是QT.这个下面我直接上代码就行,相信大家能够看懂.
QT提供了三种解析方法:SAX(Simple API XML),DOM(Document Object Model),Pull. 这篇文章我讲解DOM接口方法.
我们新建Qt GUI应用项目,名称为myDOM.在myDOM.pro中添加QT += xml.导入QtXml模块.
mian.cpp
#include <QtGui/QApplication> #include "mainwindow.h" #include <QTextCodec> int main(int argc,char *argv[]) { QApplication a(argc,argv); QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8")); MainWindow w; w.show(); return a.exec(); }
mainwindow.h
#ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> namespace Ui { class MainWindow; } class MainWindow : public QMainWindow { Q_OBJECT public: explicit MainWindow(QWidget *parent = 0); ~MainWindow(); void doXml(const QString operate); private slots: void on_pushButton_5_clicked(); void on_pushButton_4_clicked(); void on_pushButton_clicked(); void on_pushButton_2_clicked(); void on_pushButton_3_clicked(); private: Ui::MainWindow *ui; }; #endif // MAINWINDOW_H
mainwindow.cpp
#include "mainwindow.h" #include "ui_mainwindow.h" #include <QtXml> #include <QFile> /* 在构造函数创建了一个xml格式的文件保存在my.xml文件中 */ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent),ui(new Ui::MainWindow) { ui->setupUi(this); QDomDocument doc; QDomProcessingInstruction instruction; instruction = doc.createProcessingInstruction("xml","version=\"1.0\" encoding=\"UTF-8\""); doc.appendChild(instruction); QDomElement root = doc.createElement(QString("书库")); doc.appendChild(root); QDomElement book = doc.createElement(QString("图书")); QDomAttr id = doc.createAttribute(QString("编号")); QDomElement title = doc.createElement(QString("书名")); QDomElement author = doc.createElement(QString("作者")); QDomText text; id.setValue(QString("1")); book.setAttributeNode(id); text = doc.createTextNode(QString("Qt")); title.appendChild(text); text = doc.createTextNode(QString("shiming")); author.appendChild(text); book.appendChild(title); book.appendChild(author); root.appendChild(book); book = doc.createElement(QString("图书")); id = doc.createAttribute(QString("编号")); title = doc.createElement(QString("书名")); author = doc.createElement(QString("作者")); id.setValue(QString("2")); book.setAttributeNode(id); text = doc.createTextNode(QString("Linux")); title.appendChild(text); text = doc.createTextNode(QString("Linux_Google")); author.appendChild(text); book.appendChild(title); book.appendChild(author); root.appendChild(book); QFile file("my.xml"); if(!file.open(QIODevice::WriteOnly | QIODevice::Truncate)) return ; QTextStream out(&file); doc.save(out,4); /* 保存文件,4为子元素的缩进字符数 */ file.close(); } MainWindow::~MainWindow() { delete ui; } /* 显示xml文件内容到listWidget文本框中 */ void MainWindow::on_pushButton_5_clicked() { ui->listWidget->clear(); QFile file("my.xml"); if (!file.open(QIODevice::ReadOnly)) return ; QDomDocument doc; if (!doc.setContent(&file)) { file.close(); return ; } file.close(); QDomElement docElem = doc.documentElement(); QDomNode n = docElem.firstChild(); while(!n.isNull()) { if (n.isElement()) { QDomElement e = n.toElement(); ui->listWidget->addItem(e.tagName() + e.attribute(QString("编号"))); QDomNodeList list = e.childNodes(); for(int i=0; i<list.count(); i++) { QDomNode node = list.at(i); if(node.isElement()) ui->listWidget->addItem(" " + node.toElement().tagName() + " : " + node.toElement().text()); } } n = n.nextSibling(); } } /* 添加作者和名字到xml文件中 */ void MainWindow::on_pushButton_4_clicked() { ui->listWidget->clear(); ui->listWidget->addItem(QString("无法添加")); QFile file("my.xml"); if (!file.open(QIODevice::ReadOnly)) return; QDomDocument doc; if (!doc.setContent(&file)) { file.close(); return; } file.close(); QDomElement root = doc.documentElement(); QDomElement book = doc.createElement(QString("图书")); QDomAttr id = doc.createAttribute(QString("编号")); QDomElement title = doc.createElement(QString("书名")); QDomElement author = doc.createElement(QString("作者")); QDomText text; QString num = root.lastChild().toElement().attribute(QString("编号")); int count = num.toInt() +1; id.setValue(QString::number(count)); book.setAttributeNode(id); text = doc.createTextNode(ui->lineEdit_2->text()); title.appendChild(text); text = doc.createTextNode(ui->lineEdit_3->text()); author.appendChild(text); book.appendChild(title); book.appendChild(author); root.appendChild(book); if(!file.open(QIODevice::WriteOnly | QIODevice::Truncate)) return ; QTextStream out(&file); doc.save(out,4); /* 保存到文件中 */ file.close(); ui->listWidget->clear(); ui->listWidget->addItem(QString("添加成功!")); } void MainWindow::doXml(const QString operate) { ui->listWidget->clear(); ui->listWidget->addItem(QString("没有找到相关内容!")); QFile file("my.xml"); if (!file.open(QIODevice::ReadOnly)) return ; QDomDocument doc; if (!doc.setContent(&file)) { file.close(); return ; } file.close(); QDomNodeList list = doc.elementsByTagName(QString("图书")); for(int i=0; i<list.count(); i++) { QDomElement e = list.at(i).toElement(); if(e.attribute(QString("编号")) == ui->lineEdit->text()) { if(operate == "delete") { QDomElement root = doc.documentElement(); root.removeChild(list.at(i)); QFile file("my.xml"); if(!file.open(QIODevice::WriteOnly | QIODevice::Truncate)) return ; QTextStream out(&file); doc.save(out,4); file.close(); ui->listWidget->clear(); ui->listWidget->addItem(QString("删除成功!")); } else if(operate == "update") { QDomNodeList child = list.at(i).childNodes(); child.at(0).toElement().firstChild() .setNodeValue(ui->lineEdit_2->text()); child.at(1).toElement().firstChild() .setNodeValue(ui->lineEdit_3->text()); QFile file("my.xml"); if(!file.open(QIODevice::WriteOnly | QIODevice::Truncate)) return ; QTextStream out(&file); doc.save(out,4); file.close(); ui->listWidget->clear(); ui->listWidget->addItem(QString("更新成功")); } else if(operate == "find") { ui->listWidget->clear(); ui->listWidget->addItem(e.tagName() + e.attribute(QString("编号"))); QDomNodeList list = e.childNodes(); for(int i=0; i<list.count(); i++) { QDomNode node = list.at(i); if(node.isElement()) ui->listWidget->addItem(" " + node.toElement().tagName() + " : " + node.toElement().text()); } } } } } void MainWindow::on_pushButton_clicked() { doXml("find"); } void MainWindow::on_pushButton_2_clicked() { doXml("delete"); } void MainWindow::on_pushButton_3_clicked() { doXml("update"); }
mainwindow.ui设计界面和代码如下:
<?xml version="1.0" encoding="UTF-8"?> <ui version="4.0"> <class>MainWindow</class> <widget class="QMainWindow" name="MainWindow"> <property name="geometry"> <rect> <x>0</x> <y>0</y> <width>400</width> <height>300</height> </rect> </property> <property name="windowTitle"> <string>MainWindow</string> </property> <widget class="QWidget" name="centralWidget"> <widget class="QListWidget" name="listWidget"> <property name="geometry"> <rect> <x>195</x> <y>1</y> <width>201</width> <height>171</height> </rect> </property> </widget> <widget class="QLabel" name="label"> <property name="geometry"> <rect> <x>10</x> <y>20</y> <width>61</width> <height>16</height> </rect> </property> <property name="text"> <string>图书编号:</string> </property> </widget> <widget class="QLineEdit" name="lineEdit"> <property name="geometry"> <rect> <x>80</x> <y>20</y> <width>81</width> <height>20</height> </rect> </property> </widget> <widget class="QPushButton" name="pushButton"> <property name="geometry"> <rect> <x>10</x> <y>60</y> <width>75</width> <height>23</height> </rect> </property> <property name="text"> <string>查找</string> </property> </widget> <widget class="QPushButton" name="pushButton_2"> <property name="geometry"> <rect> <x>110</x> <y>60</y> <width>75</width> <height>23</height> </rect> </property> <property name="text"> <string>删除</string> </property> </widget> <widget class="QLabel" name="label_2"> <property name="geometry"> <rect> <x>10</x> <y>140</y> <width>54</width> <height>12</height> </rect> </property> <property name="text"> <string>书名:</string> </property> </widget> <widget class="QLabel" name="label_3"> <property name="geometry"> <rect> <x>10</x> <y>170</y> <width>54</width> <height>12</height> </rect> </property> <property name="text"> <string>作者:</string> </property> </widget> <widget class="QLineEdit" name="lineEdit_2"> <property name="geometry"> <rect> <x>50</x> <y>140</y> <width>113</width> <height>20</height> </rect> </property> </widget> <widget class="QLineEdit" name="lineEdit_3"> <property name="geometry"> <rect> <x>50</x> <y>170</y> <width>113</width> <height>20</height> </rect> </property> </widget> <widget class="QPushButton" name="pushButton_3"> <property name="geometry"> <rect> <x>10</x> <y>210</y> <width>75</width> <height>23</height> </rect> </property> <property name="text"> <string>更新</string> </property> </widget> <widget class="QPushButton" name="pushButton_4"> <property name="geometry"> <rect> <x>110</x> <y>210</y> <width>75</width> <height>23</height> </rect> </property> <property name="text"> <string>添加</string> </property> </widget> <widget class="QPushButton" name="pushButton_5"> <property name="geometry"> <rect> <x>250</x> <y>190</y> <width>101</width> <height>41</height> </rect> </property> <property name="text"> <string>显示全部</string> </property> </widget> </widget> <widget class="QMenuBar" name="menuBar"> <property name="geometry"> <rect> <x>0</x> <y>0</y> <width>400</width> <height>22</height> </rect> </property> </widget> <widget class="QToolBar" name="mainToolBar"> <attribute name="toolBarArea"> <enum>TopToolBarArea</enum> </attribute> <attribute name="toolBarBreak"> <bool>false</bool> </attribute> </widget> <widget class="QStatusBar" name="statusBar"/> </widget> <layoutdefault spacing="6" margin="11"/> <resources/> <connections/> </ui>