http://www.qter.org/portal.php?mod=view&aid=59php
Dom(Document Object Model,即文檔對象模型)把XML文檔轉換成應用程序能夠遍歷的樹形結構,這樣即可以隨機訪問其中的節點。它的缺點是須要將整個XML文檔讀入內存,消耗內存較多。node
在Qt中使用QDomProcessingInstruction類來表示XML說明,元素對應QDomElement類,屬性對應QDomAttr類,文本內容由QDomText類表示。全部的DOM節點,好比這裏的說明、元素、屬性和文本等,都使用QDomNode來表示,而後使用對應的isProcessingInstruction()、isElement()、isAttr()和isText()等函數來判斷是不是該類型的元素,若是是,那麼就能夠使用toProcessingInstruction()、toElement()、toAttr()和toText()等函數轉換爲具體的節點類型。dom
一、新建Qt控制檯應用。在.pro中添加:函數
QT += core xml
二、更改:ui
my.xmlcode
<?xml version="1.0" encoding="UTF-8"?> <library> <book id="01"> <title>Qt</title> <author>shiming</author> </book> <book id="02"> <title>Linux</title> <author>yafei</author> </book> </library>
main.cppxml
#include <QCoreApplication> #include <QDomDocument> #include <QFile> #include <QDebug> int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); QDomDocument doc; //新創建一個QDomDocument對象,表示一個xml文檔 QFile file("my.xml");//創建指向my.xml文件的QFile對象. /* * 打開文件的3種方法: * 一、file("my.xml")將文件添加到build-mydom-Desktop_Qt_5_8_0_MinGW_32bit-Debug目錄下 * 二、QFile file("F:/share/injector-gui2/recordshistoryrecords.xml");絕對路徑 * 三、QFile file(":/recordshistoryrecords.xml");資源文件 */ if(!file.open(QIODevice::ReadOnly)) //以只讀方式打開 { qDebug() << "打開失敗"; return 0; } QString errorStr; int errorLine; int errorCol; //setContent是將指定的內容指定給QDomDocument解析, //第一參數能夠是QByteArray或者是文件名等 if(!doc.setContent(&file, true, &errorStr, &errorLine, &errorCol)){ //將文本內容讀到doc中 qDebug() << errorStr << "line: " << errorLine << "col: " << errorCol; //若是出錯,則會進入這裏。errorStr獲得的是出錯說明,errorLine和errorCol則是出錯的行和列 file.close(); //打開失敗緣由:<?xml version="1.0"<空格>encoding="UTF-8"?>, ?lia兩邊不能有空格 return 0; } file.close(); //關閉文件 //獲取doc的第一個節點,即xml說明 QDomNode firstNode = doc.firstChild(); qDebug() << firstNode.nodeName() << firstNode.nodeValue(); //輸出xml說明:有引號 qDebug() << qPrintable(firstNode.nodeName()) << qPrintable(firstNode.nodeValue()); return a.exec(); }
#include <QCoreApplication> #include <QDomDocument> #include <QFile> #include <QDebug> int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); QDomDocument doc; //新創建一個QDomDocument對象,表示一個xml文檔 QFile file("my.xml");//創建指向my.xml文件的QFile對象. /* * 打開文件的3種方法: * 一、file("my.xml")將文件添加到build-mydom-Desktop_Qt_5_8_0_MinGW_32bit-Debug目錄下 * 二、QFile file("F:/share/injector-gui2/recordshistoryrecords.xml");絕對路徑 * 三、QFile file(":/recordshistoryrecords.xml");資源文件 */ if(!file.open(QIODevice::ReadOnly)) //以只讀方式打開 { qDebug() << "打開失敗"; return 0; } QString errorStr; int errorLine; int errorCol; //setContent是將指定的內容指定給QDomDocument解析, //第一參數能夠是QByteArray或者是文件名等 if(!doc.setContent(&file, true, &errorStr, &errorLine, &errorCol)){ //將文本內容讀到doc中 qDebug() << errorStr << "line: " << errorLine << "col: " << errorCol; //若是出錯,則會進入這裏。errorStr獲得的是出錯說明,errorLine和errorCol則是出錯的行和列 file.close(); //打開失敗緣由:<?xml version="1.0"<空格>encoding="UTF-8"?>, ?lia兩邊不能有空格 return 0; } file.close(); //關閉文件 //獲取doc的第一個節點,即xml說明 QDomNode firstNode = doc.firstChild(); //<?xml version="1.0" encoding="UTF-8"?> qDebug() << qPrintable(firstNode.nodeName()) << qPrintable(firstNode.nodeValue()); QDomElement docElem = doc.documentElement(); //library qDebug() << qPrintable(docElem.nodeName()) << qPrintable(docElem.nodeValue()); QDomNode fstNode = docElem.firstChild(); //返回根節點的第一個子節點 // qDebug() << qPrintable(fstNode.toElement().tagName()) //book, 元素標記 // << qPrintable(fstNode.toElement().attribute("id")); //01, 元素屬性id的值 while(!fstNode.isNull()) //若是節點不爲空, book { if (fstNode.isElement()) //若是節點是元素 { QDomElement e = fstNode.toElement(); //將其轉換爲元素 qDebug() << qPrintable(e.tagName()) //返回元素標記 book << qPrintable(e.attribute("id")); //返回元素id屬性的值 //獲取元素book的全部子節點鏈表 QDomNodeList list = fstNode.childNodes(); for(int i = 0; i < list.size(); ++i) //遍歷該鏈表 { QDomNode node = list.at(i); if(node.isElement()) qDebug() << " "<< qPrintable(node.toElement().tagName()) //返回元素標記 << " "<< qPrintable(node.toElement().text()); } } fstNode = fstNode.nextSibling(); //下一個兄弟節點 } return a.exec(); }