Qt解析XML文件(QDomDocument)
2018-03-06 15:53
302 查看
http://blog.sina.com.cn/s/blog_a6fb6cc90101eugv.html
关于XML及其使用场景不在此多做介绍,今天主要介绍Qt中对于XML的解析。QtXml模块提供了一个读写XML文件的流,解析方法包含DOM和SAX,两者的区别是什么呢?
DOM(Document ObjectModel):将XML文件保存为树的形式,操作简单,便于访问。SAX(Simple APIfor XML):接近于底层,速度较快,但不便于访问。
如果要使用XML时,需添加下行代码: #include并在.pro文件中添加: QT += xml
Note that QXmlStream* classes are inQtCore,这句话是说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 { QDomNodechild_dom_node = child_list.item(j); QDomElement child_element = child_dom_node.toElement(); QStringchild_tag_name = child_element.tagName(); QStringchild__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(); } }
关于XML及其使用场景不在此多做介绍,今天主要介绍Qt中对于XML的解析。QtXml模块提供了一个读写XML文件的流,解析方法包含DOM和SAX,两者的区别是什么呢?
DOM(Document ObjectModel):将XML文件保存为树的形式,操作简单,便于访问。SAX(Simple APIfor XML):接近于底层,速度较快,但不便于访问。
如果要使用XML时,需添加下行代码: #include并在.pro文件中添加: QT += xml
Note that QXmlStream* classes are inQtCore,这句话是说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 { QDomNodechild_dom_node = child_list.item(j); QDomElement child_element = child_dom_node.toElement(); QStringchild_tag_name = child_element.tagName(); QStringchild__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(); } }
相关文章推荐
- Qt解析XML文件(QDomDocument)
- 初识---Qt解析XML文件(QDomDocument)
- 初识---Qt解析XML文件(QDomDocument)
- Qt解析XML文件(QDomDocument)
- 用Qt中的QDomDocument类处理XML文件
- Qt中QDomDocument,读取txt文件和xml文件,并且修改xml文件和保存修改后的文件
- 用Qt中的QDomDocument类处理XML文件
- 用Qt中的QDomDocument类处理XML文件
- QT QDomDocument 读写XML文件
- 用Qt中的QDomDocument类处理XML文件
- 用Qt中的QDomDocument类处理XML文件
- QT中使用QXmlStreamReader解析XML文件
- XML解析之QDomDocument
- Qt 中sax方式 解析 xml文件
- qt QDomDocument
- qt xml QDomDocument 方式读
- Qt解析XML相关(QDom方式)
- QT中使用QXmlStreamReader解析XML文件
- 读写文件的几种方法std::fstream、fopen操作;解析XML方法:pugi、QDomDocument
- VS2010下,编译QT , #include <QDomDocument> 找不见 ,这么解决