XML简介
XML(Extensible Markup Language,可扩展标记语言)是一种类似于HTML的标记语言,设计的目的是传输数据,而不是显示数据。
XML的标签没有被预定义,用户需要在使用时自定义。
XML使用的树形结构更能表现出数据的包含关系。
XML是一种文本文件格式,在信息存储和描述领域非常流行。
Qt 操作XML文档一般方法
Qt提供了QtXML模块来进行XML文档的处理,这里提供了3种解析方法:
-
DOM方法,可以进行读和写
-
SAX方法,可以进行读取
-
基于流的方法,QXmlStreamReader和QXmlStreamWriter进行读取和写入。
Qt提供了更高级的QtXmlPatterns来进行XML数据的查询和操作。支持XQuery1.0和XPath2.0
使用DOM读取XML文档
DOM(Document Object Model,文档对象模型),提供了一个接口来访问和改变一个XML文件的内容和结构,可以将XML文档表示为一个存储在内存中具有层次的树形图。
文档本身由QDOMDocument对象来表示,文档中所有的DOM节点都是QDomNode类的子类。
Qt中使用QDomProcessingInstruction 类来表示XML说明。
XML文档内容有多个元素组成。元素对应QDomElement类。
元素可以包含属性。属性对应QDomAttr类。
元素可以包含子元素,也可以只包含文本内容,文本内容由QDomText类表示。
所有的DOM节点,比如说明、元素、属性、文本等都使用QDomNode来表示,然后使用对应的isProcessingInstruction()、isElement()、isAttr()和isText()等函数来判断是否是该类型的元素。如果是,就可以使用toProcessingInstruction()、toElement()、toAttribute()、toText()等函数转化为具体的节点类型。
读取XML文档的一般步骤
1、打开 XML文件
2、新建QDomDocument 对象,将此对象命名,如命名为 doc
3、将文件内容读取到doc 中
4、关闭文件
5、对doc 进行操作
示例代码:读取XML文档
1、.pro 添加QT += XML
2、#include<QXml>
代码示例:
#include <QtCore/QCoreApplication>
#include <QtXml>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
// 新建QDomDocument类对象,它代表一个XML文档
QDomDocument doc;
QFile file("../myDOM1/my.xml");
if (!file.open(QIODevice::ReadOnly)) return 0;
// 将文件内容读到doc中
if (!doc.setContent(&file)) {
file.close();
return 0;
}
// 关闭文件
file.close();
// 获得doc的第一个结点,即XML说明
QDomNode firstNode = doc.firstChild();
// 输出XML说明,nodeName()为“xml”,nodeValue()为版本和编码信息
qDebug() << qPrintable(firstNode.nodeName())
<< qPrintable(firstNode.nodeValue());
// 返回根元素
QDomElement docElem = doc.documentElement();
// 返回根节点的第一个子结点
QDomNode n = docElem.firstChild();
// 如果结点不为空,则转到下一个节点
while(!n.isNull())
{
// 如果结点是元素
if (n.isElement())
{
// 将其转换为元素
QDomElement e = n.toElement();
// 返回元素标记和id属性的值
qDebug() << qPrintable(e.tagName())
<< qPrintable(e.attribute("id"));
// 获得元素e的所有子结点的列表
QDomNodeList list = e.childNodes();
// 遍历该列表
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();
}
return a.exec();
}