Qt - XML和JSON

1. XML

1.1 简介

可扩展标记语言,标准通用标记语言(Extensible Markup Language)的子集,简称XML,是一种定义电子文档结构和描述其内容的国际标准语言,被设计用来传输和存储数据。

可扩展标记语言与Access],Oracle]和SQL Server等数据库不同,数据库提供了更强有力的数据存储和分析能力,例如:数据索引、排序、查找、相关一致性等,可扩展标记语言仅仅是存储数据。事实上它与其他数据表现形式最大的不同是:可扩展标记语言极其简单,这是一个看上去有点琐细的优点,但正是这点使它与众不同。

XML的简单易于在任何应用程序中读/写数据,这使XML很快成为数据交换的唯一公共语言,虽然不同的应用软件也支持其他的数据交换格式,但不久之后它们都将支持XML,那就意味着程序可以更容易的与Windows、Mac OS、Linux以及其他平台下产生的信息结合,然后可以很容易加载XML数据到程序中并分析它,并以XML格式输出结果。

1.2 格式

为了避免错误,需要规定 XML 编码,或者将 XML 文档存为 Unicode。

W3school XML教程

XML文件格式是纯文本格式,在许多方面类似于HTML,XML由XML元素组成,每个XML元素包括一个开始标记<>,一个结束标记</>以及两个标记之间的内容,例如,可以将XML元素标记为价格、订单编号或名称。标记是对文档存储格式和逻辑结构的描述。在形式上,标记中可能包括注释、引用、字符数据段、起始标记、结束标记、空元素、文档类型声明( DTD)和序言。

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

具体规则如下:

  • 1、必须有声明语句。

XML声明是XML文档的第一句,其格式如下:

<?xml version="1.0" encoding="utf-8"?>
  • 2、注意大小写

在XML文档中,大小写是有区别的。“A”和“a”是不同的标记。注意在写元素时,前后标记的大小写要保持一致。最好养成一种习惯,或者全部大写,或者全部小写,或者大写第一个字母,这样可以减少因为大小写不匹配而产生的文档错误。

  • 3、XML文档有且只有一个根元素

良好格式的XML文档必须有一个根元素,就是紧接着声明后面建立的第一个元素,其他元素都是这个根元素的子元素,根元素完全包括文档中其他所有的元素。根元素的起始标记要放在所有其他元素的起始标记之前;根元素的结束标记要放在所有其他元素的结束标记之后。

  • 4、属性值使用引号

在HTML代码里面,属性值可以加引号,也可以不加。但是XML规定,所有属性值必须加引号(可以是单引号,也可以是双引号,建议使用双引号),否则将被视为错误。

  • 5、所有的标记必须有相应的结束标记

在HTML中,标记可以不成对出现,而在XML中,所有标记必须成对出现,有一个开始标记,就必须有一个结束标记,否则将被视为错误。

  • 6、所有的空标记也必须被关闭

空标记是指标记对之间没有内容的标记, 由于空标记不含任何内容,所以空标记不需要开始标签和结束标签,空标记“<”标识开始,以“/>”标识结束,如:比如<door color="red"/>

1.3 XML解析

Qt 提供了三种读取 XML 文档的方法:

  • QXmlStreamReader:一种快速的基于流的方式访问良格式 XML 文档,特别适合于实现一次解析器(所谓“一次解析器”,可以理解成我们只需读取文档一次,然后像一个遍历器从头到尾一次性处理 XML 文档,期间不会有反复的情况,也就是不会读完第一个标签,然后读第二个,读完第二个又返回去读第一个,这是不允许的);
  • DOM(Document Object Model):将整个 XML 文档读入内存,构建成一个树结构,允许程序在树结构上向前向后移动导航,这是与另外两种方式最大的区别,也就是允许实现多次解析器(对应于前面所说的一次解析器)。DOM 方式带来的问题是需要一次性将整个 XML 文档读入内存,因此会占用很大内存;
  • SAX(Simple API for XML):提供大量虚函数,以事件的形式处理 XML 文档。这种解析办法主要是由于历史原因提出的,为了解决 DOM 的内存占用提出的(在现代计算机上,这个一般已经不是问题了)。

有如下XML文档,描述了登录数据库所需要的信息,通过解析可以获取信息以登录数据库。

<?xml version="1.0" encoding="utf-8"?>
<root>
    <HostName>localhost</HostName>
    <Port>3306</Port>
    <UserName>root</UserName>
    <PassWord>123456789</PassWord>
    <DatabaseName>Maye</DatabaseName>
</root>

上面的xml不带属性,下面的xml是Qt ui文件部分代码

<?xml version="1.0" encoding="utf-8"?>
<ui>
    <widget class="QWidget" name="MainWindow">
        <property name="geometry">
            <rect>
                <x>0</x>
                <y>0</y>
                <width>989</width>
                <height>594</height>
            </rect>
        </property>
    </widget>
</ui>

1.3.1 QXmlStreamReader

QXmlStreamReader类提供了一个快速解析器,通过简单的流API读取格式良好的XML 。

QXmlStreamReader从QIODevice或原始QByteArray读取数据。

void Widget::parseXml(const QString &filename)
{
    QFile file(filename);
    if(!file.open(QIODevice::ReadWrite | QIODevice::Text))
    {
        qWarning("%s 文件打开失败",filename.toUtf8().data());
        return;
    }
​
    //定义解析器对象
    QXmlStreamReader xmlReader(&file);
​
    //解析xml,直到结束或发送错误
    while (!xmlReader.atEnd() && !xmlReader.hasError())
    {
        QXmlStreamReader::TokenType type = xmlReader.readNext();
        //是申明:<?xml version="1.0" encoding="utf-8"?>
        if(type == QXmlStreamReader::TokenType::StartDocument)
        {
            qDebug() <<xmlReader.documentVersion()<<xmlReader.documentEncoding();
        }
        else if (type == QXmlStreamReader::TokenType::StartElement)
        {
            //读取元素名和元素文本
            if(xmlReader.name() == "HostName")
            {
                qDebug()<<xmlReader.name()<<xmlReader.readElementText();
            }
            else if(xmlReader.name() == "Port")
            {
                qDebug()<<xmlReader.name()<<xmlReader.readElementText();
            }
            else if(xmlReader.name() == "UserName")
            {
                qDebug()<<xmlReader.name()<<xmlReader.readElementText();
            }
            else if(xmlReader.name() == "PassWord"
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值