Qt解析XML文件(QDomDocument)
(2013-08-02 22:25:27)
標籤:
qtqt解析xmlqtxmlqdomdocument |
分類: Qt |
關於XML及其使用場景不在此多做介紹,今天主要介紹Qt中對於XML的解析。QtXml模塊提供了一個讀寫XML文件的流,解析方法包含DOM和SAX,兩者的區別是什麼呢?
DOM(Document Object Model):將XML文件保存爲樹的形式,操作簡單,便於訪問。
SAX(Simple API for XML):接近於底層,速度較快,但不便於訪問。
如果要使用XML時,需添加下行代碼:
#include
並在.pro文件中添加:
QT += xml
Note that QXmlStream* classes are in QtCore,這句話是說QXmlStreamReader和QXmlStreamWriter不在模塊QtXml中,而是在QtCore中,該模塊只涉及DOM和SAX基於XML的接口。
此模塊中包含的類不再多作介紹,詳情請查看:http://qt-project.org/doc/qt-4.8/qtxml.html
例子:
person.xml文件如下所示:
解析方法:
void ParseXML::parse(QString file_name)
{
if(file_name.isEmpty())
return;
QFile file(file_name);
if(!file.open(QFile::ReadOnly | QFile::Text))
{
QMessageBox::information(NULL, QString("title"), QString("open error!"));
return;
}
QDomDocument document;
QString error;
int row = 0, column = 0;
if(!document.setContent(&file, false, &error, &row, &column))
{
QMessageBox::information(NULL, QString("title"), QString("parse file failed at line row and column") + QString::number(row, 10) + QString(",") + QString::number(column, 10));
return;
}
if(document.isNull())
{
QMessageBox::information(NULL, QString("title"), QString("document is null!"));
return;
}
QDomElement root = document.documentElement();
//root_tag_name爲persons
QString root_tag_name = root.tagName();
if(root.hasAttribute("name"))
{
//name爲Qt
QString name = root.attributeNode("name").value();
}
//獲取id="1"的節點
QDomElement person = root.firstChildElement();
if(person.isNull())
return;
QString person_tag_name = person.tagName();
//id爲1
QString id = person.attributeNode("id").value();
//獲取子節點,數目爲2
QDomNodeList list = root.childNodes();
int count = list.count();
for(int i=0; i
{
QDomNode dom_node = list.item(i);
QDomElement element = dom_node.toElement();
//獲取id值,等價
QString id_1 = element.attributeNode("id").value();
QString id_2 = element.attribute("id");
//獲取子節點,數目爲4,包括:name、age、email、website
QDomNodeList child_list = element.childNodes();
int child_count = child_list.count();
for(int j=0; j
{
QDomNode child_dom_node = child_list.item(j);
QDomElement child_element = child_dom_node.toElement();
QString child_tag_name = child_element.tagName();
QString child__tag_value = child_element.text();
}
}
//按照name、age、email、website的順序獲取值
QDomElement element = person.firstChildElement();
while(!element.isNull())
{
QString tag_name = element.tagName();
QString tag_value = element.text();
element = element.nextSiblingElement();
}
}