在Qt中提供了QtXml模块实现了对XML数据的处理,咱们在Qt帮助中输入关键字QtXml Module,能够看到该模块的类表。在这里咱们能够看到全部相关的类,它们主要是服务于两种操做XML文档的方法:DOM和SAX。 Dom(Document Object Model,即文档对象模型)把XML文档转换成应用程序能够遍历的树形结构,这样即可以随机访问其中的节点。它的缺点是须要将整个XML文档读入内存, 消耗内存较多。除了上面的两种方法外,Qt还提供了简单的QXmlStreamReader和QXmlStreamWriter对XML文档进行读写,下 面咱们先介绍使用DOM的方式来操做XML文档。 node
<?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文档,具体代码以下: spa
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(); code