您的位置:首页 > 编程语言 > Qt开发

QT开发之XML(DOM接口)

2016-12-04 23:55 155 查看
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>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: