Qt中使用DOM讀寫XML文檔

須要在.pro文件添加QT += xml
DOM(Document Object Model)能夠將XML文檔讀入到內存中進而顯示和修改,至關於一個緩衝區。文檔由QDomDocument表示,全部DOM節點都是QDomNode的子類node

建立XML
一 建立 QDomDocument doc;
二 建立處理指令
三 建立根元素(根元素及其包含的元素其實都是QDomElement)
四 建立第一個元素及其子元素~~~~app

1 建立元素
2 建立屬性(還能夠賦值)
3 給元素設置屬性節點 `book.setAttributeNode(id);`

4 建立子元素
5 建立文本節點
6 給子元素附加文本子節點 `title.appendChild(text);`

7 給元素附加子元素節點 `book.appendChild(title);`
8 給根元素附加子節點 `root.appendChild(book);`

9 建立文件以只寫模式打開並關聯到文本流 `QTextStream out(&file);`
10 保存,4爲子元素縮進字符數 `doc.save(out, 4);`而後關閉文件

讀取XML
一 建立 QDomDocument doc;
二 只讀打開文件內容到doc而後關閉文件
三 建立並獲取節點 QDomNode docNode = doc.documentElement().firstChild();
四 判斷建立的節點非空
五 跳過處理指令 if (docNode.isElement())
六 將格式從節點轉爲元素
七 讀取元素名稱等信息
八 建立節點列表讀入元素的全部子節點 QDomNodeList list = elem.childNodes();
九 判斷是否爲元素,轉格式,讀取信息
十 更新docNode到下一個節點~~~~ui

寫入XML:增
一 建立 QDomDocument doc;
二 只讀打開文件內容到doc而後關閉文件
三 建立、獲取根元素及其最後子元素編號
四 建立新元素設置屬性節點
五 建立子元素、文本
六 文本附加到子元素,子元素附加到新元素,新元素附加到根元素
七 只寫截斷打開文件,關聯到文本流
八 保存文件,關閉文件this

寫入XML:刪
一 建立 QDomDocument doc;
二 只讀打開文件內容到doc而後關閉文件
三 以標籤名查找元素節點 QDomNodeList list = doc.elementsByTagName("圖書");
四 按屬性逐個比對
五 從根元素刪除目標元素,保存spa

寫入XML:改
一 建立 QDomDocument doc;
二 只讀打開文件內容到doc而後關閉文件
三 以標籤名查找元素節點 QDomNodeList list = doc.elementsByTagName("圖書");
四 按屬性逐個比對
五 獲取目標節點的子節點 QDomNodeList child = list.at(i).childNodes();
六 修改信息,保存code

寫入XML:查
一 建立 QDomDocument doc;
二 只讀打開文件內容到doc而後關閉文件
三 以標籤名查找元素節點 QDomNodeList list = doc.elementsByTagName("圖書");
四 按屬性逐個比對
五 獲取目標節點的子節點,顯示xml

代碼以下,界面部分是一個listWidget和幾個按鍵
無標題.pngblog

`
#include "mainwindow.h"
#include "ui_mainwindow.h"

#include <QtXml>
#include <QFile>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    QDomDocument doc;

    //添加處理指令即XML說明
    QDomProcessingInstruction instruction;
    instruction = doc.createProcessingInstruction("xml",
                                                  "version= \"1.0\""
                                                  " encoding= \"UTF-8\"");
    doc.appendChild(instruction);

    //添加根元素
    QDomElement root = doc.createElement("書庫");
    doc.appendChild(root);

    //添加第一個圖書元素及其子元素
    QDomElement book = doc.createElement("圖書");
    QDomAttr id = doc.createAttribute("編號");
    id.setValue(QString("1"));
    book.setAttributeNode(id);

    QDomElement title = doc.createElement("書名");
    QDomText text = doc.createTextNode("Qt");
    title.appendChild(text);

    QDomElement author = doc.createElement("做者");
    text = doc.createTextNode("shiming");
    author.appendChild(text);

    book.appendChild(title);
    book.appendChild(author);

    root.appendChild(book);

    //添加第二個圖書元素及其子元素
    book = doc.createElement("圖書");
    id = doc.createAttribute("編號");
    title = doc.createElement("書名");
    author = doc.createElement("做者");

    id.setValue(QString("2"));
    book.setAttributeNode(id);
    text = doc.createTextNode("Qt2");
    title.appendChild(text);
    text = doc.createTextNode("shiming");
    author.appendChild(text);
    book.appendChild(title);
    book.appendChild(author);
    root.appendChild(book);

    saveMyXml(doc);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_pushButton_5_clicked()
{
    //先清空顯示
    ui->listWidget->clear();

    QDomDocument doc;
    openMyXmlReadOnly(doc);

    QDomNode docNode = doc.documentElement().firstChild();
    while (!docNode.isNull()) {
        if (docNode.isElement()){
            QDomElement elem = docNode.toElement();
            ui->listWidget->addItem(elem.tagName() + elem.attribute("編號"));
            QDomNodeList list = elem.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());
                }
            }
        }
        docNode = docNode.nextSibling();
    }
}

void MainWindow::on_pushButton_4_clicked()
{
    //先清空顯示,而後顯示「沒法添加」,這樣若是添加失敗則顯示「沒法添加」
    ui->listWidget->clear();
    ui->listWidget->addItem("沒法添加!");

    QDomDocument doc;
    openMyXmlReadOnly(doc);

    QDomElement root = doc.documentElement();    
    QString lastNum = root.lastChild().toElement().attribute("編號");

    QDomElement book = doc.createElement("圖書");
    QDomAttr id = doc.createAttribute("編號");
    id.setValue(QString::number(lastNum.toInt() +1));
    book.setAttributeNode(id);

    QDomElement title = doc.createElement("書名");
    QDomText text = doc.createTextNode(ui->lineEditBookName->text());
    title.appendChild(text);
    book.appendChild(title);

    QDomElement author = doc.createElement("做者");
    text = doc.createTextNode(ui->lineEditAuthor->text());
    author.appendChild(text);
    book.appendChild(author);

    root.appendChild(book);

    saveMyXml(doc);
    //最後更改顯示爲「添加成功」
    ui->listWidget->clear();
    ui->listWidget->addItem("添加成功!");

}

void MainWindow::doXml(const QString operate)
{
    ui->listWidget->clear();
    ui->listWidget->addItem("沒有找到相關內容");

    QDomDocument doc;
    openMyXmlReadOnly(doc);

    //以標籤名查找
    QDomNodeList list = doc.elementsByTagName("圖書");
    for (int i=0; i<list.count(); ++i){
        QDomElement element = list.at(i).toElement();
        if (element.attribute("編號") == ui->lineEditBookNum->text()){
            if (operate == "delete"){
                QDomElement root = doc.documentElement();
                root.removeChild(list.at(i));

                saveMyXml(doc);
                ui->listWidget->clear();
                ui->listWidget->addItem("刪除成功");
            }else if (operate == "update") {
                QDomNodeList child = list.at(i).childNodes();
                child.at(0).toElement().firstChild()
                        .setNodeValue(ui->lineEditBookName->text());
                child.at(1).toElement().firstChild()
                        .setNodeValue(ui->lineEditAuthor->text());

                saveMyXml(doc);
                ui->listWidget->clear();
                ui->listWidget->addItem("更新成功");
            }else if (operate == "find") {
                ui->listWidget->clear();
                ui->listWidget->addItem(element.tagName()
                                        + element.attribute("編號"));
                QDomNodeList list = element.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::openMyXmlReadOnly(QDomDocument & doc)
{
    QFile file("my.xml");
    if (!file.open(QIODevice::ReadOnly))
        return;
    if (!doc.setContent(&file)){
        file.close();
        return;
    }
    file.close();
}

void MainWindow::openMyXmlWriteOnly(QDomDocument & doc)
{
    QFile file("my.xml");
    if (!file.open(QIODevice::WriteOnly | QIODevice::Truncate))
        return;
    if (!doc.setContent(&file)){
        file.close();
        return;
    }
    file.close();
}

void MainWindow::saveMyXml(QDomDocument & doc)
{
    QFile file("my.xml");
    if (!file.open(QIODevice::WriteOnly | QIODevice::Truncate))
        return;
    QTextStream out(&file);
    //將文檔保存到文件,4爲子元素縮進字符數
    doc.save(out, 4);
    file.close();
}

void MainWindow::on_pushButton_clicked()
{
    doXml("find");
}

void MainWindow::on_pushButton_2_clicked()
{
    doXml("delete");
}

void MainWindow::on_pushButton_3_clicked()
{
    doXml("update");
}
`
相關文章
相關標籤/搜索