Qt 读取XML文档的简单示例

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();
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章