須要在.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和幾個按鍵blog
` #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"); } `