Qt有关XML的编程

XML是一种类式于HTML的标记语言,设计的目的在于传输数据,而不是显示数据。XML标签没有预定义,用户使用时需要自定义。XML是W3C(万维网联盟)推荐的标准。相对于数据库表格二维表示,XML使用树形结构更能表现出数据的包含关系,作为一种文本格式,XML简单明了的特性使得它在信息存储和描述领域非常流行。

Qt中提供了QtXml模块画进行XML文档的处理,这里主要有3种解析方法:

DOM方法:可以进行读写。

SAX方法:可以进行读取。

基于流的方法:分别使用QXmlStreamReader和QXmlSteamWriter进行读取和写入。

要在项目使用QtXml模块,还需要在项目文件中(.project)添加:QT +=xml.

一 、DOM:

 1.1使用DOM读取文档

DOM(Document Object Model,文档对象模型),是W3C推荐的标准,提供了一个接口来访问和改变一个XML文件的内容和结构,可以将XML文档表示为一个存储在内存中的树视图。文档本身由QDomDocument对象表示,而文档树中所有的DOM节点都是QDomNode类的子类。

#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 docdocElem = 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()); 
            } 
        } 
        // 转到下一个兄弟结点 
        nn = n.nextSibling(); 
    } 
 
    return a.exec(); 
} 

1.2使用DOM创建和操作XML文档

二 SAX:

SAX(Simple API for XML)为XML解析器提供了一个基于事件的标准接口。在Qt中的支持SAX2,但并不支持Java接口的SAX1.在前面讲解到DOM方法需要在树结构中读入和存储整个XML文档,这样会耗费大量的内存,不过使用它来操作文档结构很容易的。如里不需要对文档进行操作,而只需要读取整个文档,使用SAX方法就很高效了。SAX2接口一个事件驱动机制,用来为用户提供文档信息。这里的事件由解析器发出的,例如它遇到一个开始标签或者结束标签等。

三 XML流:

从Qt 4.3开始,引入两个新的类来读取和写入文档:QXmlStreamReader和QXmlStramWriter.

QXmlStreamReader类提供了一个快速解析器,通过一个简单的流API来读取格式良好的XML文档,安做为SAX的替代品出现的,因为它比SAX解析器更方便。

QXmlStreamReader可以从QIODevice或者QByteArray中读取数据。流读取的基本原理就是将XML文档报告为一个记号流,这一点与SAX相似,不同之处在于XML记号被报告的方式。SAX是利用回调函数来从解析器获得所谓的XML事件。而对于QXmlStreamReader,是应用程序代码本身来驱动循环,需要的时候可以从读取器中一个一个的拉出信号,这是通过readNext()函数来实现的,它可以读取一个记号,然后返回一个记号类型。

本文福利,费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QSS,OpenCV,Quick模块,面试题等等)↓↓↓↓↓↓见下面↓↓文章底部点击费领取↓↓

猜你喜欢

转载自blog.csdn.net/m0_60259116/article/details/128678718
今日推荐