×
Namespaces

Variants
Actions

Qt中如何使用DOM解析XML

From Nokia Developer Wiki
Jump to: navigation, search
Article Metadata

代码示例
兼容于
平台:
Symbian

文章
liuting 在 11 Jan 2012 创建
最后由 hamishwillee 在 26 Jul 2012 编辑

Contents

介绍

在Qt中提供了QtXml模块实现了对XML数据的处理,我们在Qt帮助中输入关键字QtXml Module,可以看到该模块的类表。在这里我们可以看到所有相关的类,它们主要是服务于两种操作XML文档的方法:DOM和SAX。Dom(Document Object Model,即文档对象模型)把XML文档转换成应用程序可以遍历的树形结构,这样便可以随机访问其中的节点。它的缺点是需要将整个XML文档读入内存,消耗内存较多。除了上面的两种方法外,Qt还提供了简单的QXmlStreamReader和QXmlStreamWriter对XML文档进行读写,下面我们先介绍使用DOM的方式来操作XML文档。

规范的XML文档

<?xml version=”1.0″ encoding=”UTF-8″?>  //XML说明
 
<library> //根元素
 
<book id=”01″> //library元素的第一个子元素,“id”是其属性
 
<title>Qt</title> //book元素的子元素,“Qt”是元素的文本
 
<author>shiming</author> //book元素的子元素,title元素的兄弟元素
 
</book> //结束标记名
 
<book id=”02″>
 
<title>Linux</title>
 
<author>yafei</author>
 
</book>
 
</library>

可以看到,一个规范的XML文档,是用XML说明开始的,主要由各元素组成。XML文档第一个元素就是根元素,XML文档必须有且只有一个根元素。元素是可以嵌套

代码实现

首先需要在工程文件中手动添加QT += xmL 接下来需要新建QDomDocument类对象,它代表一个XML文档,具体代码如下:

QDomDocument doc;   //新建QDomDocument类对象,它代表一个XML文档
 
QFile file(“my.xml”); //建立指向“my.xml”文件的QFile对象
 
if (!file.open(QIODevice::ReadOnly)) return 0; //以只读方式打开
 
if (!doc.setContent(&file)) { file.close(); return 0; }
 
//将文件内容读到doc中
file.close();

然后我们解析各个接点,具体代码如下:

QDomElement docElem = doc.documentElement();  //返回根元素
 
QDomNode n = docElem.firstChild(); //返回根节点的第一个子节点
 
while(!n.isNull())
 
{ //如果节点不为空
 
if (n.isElement()) //如果节点是元素
 
{
 
QDomElement e = n.toElement(); //将其转换为元素
 
qDebug() << qPrintable(e.tagName()) //返回元素标记
 
<< qPrintable(e.attribute(“id”)); //返回元素id属性的值
QDomNodeList list = e.childNodes(); //获得元素e的所有子节点的列表
 
for(int i=0; i<list.count(); i++) //遍历该列表
 
{
 
QDomNode node = list.at(i);
 
if(node.isElement())
 
qDebug() << “ “<< qPrintable(node.toElement().tagName())
 
<<qPrintable(node.toElement().text());
 
}
 
}
 
n = n.nextSibling(); //下一个兄弟节点
 
}

总结

小结:通过上面的例子,我们实现了对一个XML文档的读取。可以看到,在QDom中,是将整个XML文件读到内存中的doc对象中的。然后使用节点(QDomNode )操作doc对象,像XML说明,元素,属性,文本等等都被看做是节点,这样就使得操作XML文档变得很简单,我们只需通过转换函数将节点转换成相应的类型,如QDomElement e = n.toElement();

代码示例

File:HelloXMLDom.zip

相关链接

This page was last modified on 26 July 2012, at 09:34.
230 page views in the last 30 days.

Was this page helpful?

Your feedback about this content is important. Let us know what you think.

 

Thank you!

We appreciate your feedback.

×