2021-04-15qt对XML文件的使用

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2021-04-15qt对XML文件的使用相关的知识,希望对你有一定的参考价值。

参考技术A 创建一个XML文件:

1:创建一个文件对象(QFile),创建文件对象的时候可能会出现两种情况,一是文件已存在,二是

文件不存在,文件存在则我们可以直接拿来使用,不存在则需要创建

2:创建文件之后则是打开文件,并且指定文件的读写权限

3:创建一个QDomDocument文档对象

4:创建一个XML头部格式

5:将前面创建的XML头部格式追加到前面创建的XML文档对象中

6:创建根节点

7:将创建的根节点追加到前面创建的XML文档对象中

8:创建一个文本流并且将它和我们前面创建的文件对象关联起来

9:将文本流中的内容保存到我们前面创建的QDomDocument对象中,并且指定文档以几个字符缩进

10:在创建完成后,假如没有其它的操作则将文件对象关闭

/***

void DocXML::createXML(QString file_path)



    QFile file(file_path);//关联文件名字

    if(true==file.exists())//如果存在不创建

   

        cout<<"文件已经存在";

        return;

   

    else

   

        //不存在创建

        //只写文件

        bool isOK=file.open(QIODevice::WriteOnly);

        if(true==isOK)//如果打开成功

       

            //创建XML文档

            QDomDocument doc;

            //创建XML头部格式

            QDomProcessingInstruction ins;

            ins=doc.createProcessingInstruction("xml","version=\'1.0\' encoding=\'utf-8\'");

            //追加元素

            doc.appendChild(ins);

            //创建根节点

            QDomElement root=doc.createElement(QStringLiteral("日销售清单"));

            //QDomElement root=doc.createElement("helloworld");

            //追加

            doc.appendChild(root);

            //保存

            QTextStream stream(&file);//和文本流关联文件

            doc.save(stream,4);//保存文件并且以4个字符的方式缩进

            //关闭文件

            file.close();

       

        else

       

            cout<<"writeOnly error";

       

   



**/

向一个已存在的XML文件对象中添加节点和元素:

1:打开一个已存在的XML文档,并将打开函数的返回值保存下来

2:在返回值为真的情况下,我们将文件和一个QDomDocument关联起来,将关联函数的返回值保存起来

3:在关联函数的返回值为真的情况下,我们可以将前面打开的文件对象关闭

4:获取根节点元素

5:获取当前时间

6:将我们获取的当前日期转换为字符串

7:判断我们前面获取的根节点下面有没有子节点

8:在没有的情况下,我们创建一个日期子节点

9:创建一个属性值

10:设置前面创建的属性值

11:将我们创建的日期节点和我们前面创建的属性关联起来

12:将我们创建的日期节点追加到根节点下

13:写入有效数据

13.1:获取当前时间

13.2:将获取的时间转换为字符串

13.3:创建一个新的时间节点元素

13.4:创建一个属性

13.5:给我们创建的属性设置值

13.6:将时间节点元素和我们前面创建的时间节点关联

13.7:将时间节点追加到最开始创建的那个日期节点后面

13.8:创建节点里的元素

13.9:将元素和节点关联

13.10:将新的节点追加到父节点哪里

void DocXML::appendXML(QString file_Path, QStringList list)



    QFile file(file_Path);

    bool isOK=file.open(QIODevice::ReadOnly);

    if(true==isOK)

   

        //文件和xml广联

        QDomDocument doc;

        isOK=doc.setContent(&file);

        if(isOK)

       

            file.close();//关联成功后关闭文件

            //获取根节点元素

            QDomElement root=doc.documentElement();

            //获取当前时间

            QDateTime date=QDateTime::currentDateTime();

            //将获取的时间装换位字符串

            QString dateStr=date.toString("yyyy-MM-dd");//2021-01-08

            //判断根节点下有没有子节点

            if(root.hasChildNodes())//有子节点

           

           

            else//没有子节点

           

                //创建日期子节点

                QDomElement dataEmt=doc.createElement(QStringLiteral("日期"));

                //创建date属性

                QDomAttr dataAttr=doc.createAttribute("date");

                //设置属性的值

                dataAttr.setNodeValue(dateStr);

                //把节点和属性关联

                dataEmt.setAttributeNode(dataAttr);

                //把日期节点追加到根节点下

                root.appendChild(dataEmt);

                //写有效数据

                writeXML(doc,dataEmt,list);

           

            //保存文件

            isOK=file.open(QIODevice::WriteOnly);

            if(isOK)

           

                QTextStream stream(&file);

                doc.save(stream,4);

                file.close();

           

       

        else

       

            cout<<"setContent error";

            return;

       

   

    else

   

        cout<<"readOnly error";

   



void DocXML::writeXML(QDomDocument &doc, QDomElement &root, QStringList &list)



    //获取当前时间

    QDateTime tiem=QDateTime::currentDateTime();

    //将获取的时间装换位字符串

    QString timeStr=tiem.toString("hh-mm-ss");//16:05:03

    //创建时间节点元素

    QDomElement timeEmt=doc.createElement(QStringLiteral("时间"));

    //创建属性

    QDomAttr timeAtrr=doc.createAttribute("time");

    //给属性设置值

    timeAtrr.setNodeValue(timeStr);

    //时间节点元素和时间节点关联

    timeEmt.setAttributeNode(timeAtrr);

    //把时间节点追加到日期节点后面

    root.appendChild(timeEmt);

    //创建节点里的元素

    QDomElement factory=doc.createElement(QStringLiteral("厂家"));

    QDomElement brand=doc.createElement(QStringLiteral("品牌"));

    QDomElement price=doc.createElement(QStringLiteral("报价"));

    QDomElement number=doc.createElement(QStringLiteral("数量"));

    QDomElement total=doc.createElement(QStringLiteral("金额"));

    //将元素和节点关联

    QDomText text=doc.createTextNode(list.at(0));

    factory.appendChild(text);

    text=doc.createTextNode(list.at(1));

    brand.appendChild(text);

    text=doc.createTextNode(list.at(2));

    price.appendChild(text);

    text=doc.createTextNode(list.at(3));

    number.appendChild(text);

    text=doc.createTextNode(list.at(4));

    total.appendChild(text);

    //将新的节点追加到父节点哪里

    timeEmt.appendChild(factory);

    timeEmt.appendChild(brand);

    timeEmt.appendChild(price);

    timeEmt.appendChild(number);

    timeEmt.appendChild(total);

QT开发(四十一)——XML文件解析基础

QT开发(四十一)——XML文件解析基础

一、XML文档简介

    XML(Extensible Markup Language,可扩展标记语言),是一种通用的文本格式,被广泛运用于数据交换和数据存储,而不是显示数据。XML的标签没有被预定义,用户需要在使用时自行进行定义。XML是W3C(万维网联盟)的推荐标准。相对于数据库表格的二维表示,XML使用的树形结构更能表现出数据的包含关系,作为一种文本文件格式,XML简单明了的特性使得它在信息存储和描述领域非常流行。

<?xml version="1.0" encoding="UTF-8"?>

<library>

   <book id="01">

       <title>Qt</title>

       <author>shiming</author>

    </book>

   <book id="02">

       <title>Linux</title>

       <author>yafei</author>

   </book>

</library>

    每个XML文档都由XML说明(或者称为XML序言)开始,它是对XML文档处理的环境和要求的说明,比如这里的<?xmlversion="1.0" encoding="UTF-8"?>,其中xml version=“1.0”,表明使用的XML版本号,这里字母是区分大小写的;encoding=“UTF-8”是使用的编码,指出文档是使用何种字符集建立的,默认值为Unicode编码。XML文档内容由多个元素组成,一个元素由起始标签<标签名>和终止标签</标签名>以及两个标签之间的内容组成,而文档中第一个元素被称为根元素,比如这里的<library></library>XML文档必须有且只有一个根元素。元素的名称是区分大小写的,元素还可以嵌套,比如这里的librarybooktitleauthor等都是元素。元素可以包含属性,用来描述元素的相关信息,属性名和属性值在元素的起始标签中给出,格式为<元素名 属性名=“属性值”>,如<book id=“01”>,属性值必须在单引号或者双引号中。在元素中可以包含子元素,也可以只包含文本内容,比如这里的<title>Qt</title>中的Qt就是文本内容。

二、XML文件结构

1、XML文件头

    XML文件头由XML声明与DTD文件类型声明组成。其中DTD文件类型声明是可以缺少的,而XML声明是必须要有的,以使文件符合XML的标准规格。

XML声明如下:

<?xml version="1.0" encoding="gb2312"?>

XML声明必须在XML文档的第一行

“<?”代表一条指令的开始,“?>”代表一条指令的结束;

“xml”代表此文件是XML文件;

“ version="1.0" ”代表此文件用的是XML1.0标准;

“ encoding="gb2312" ” 代表此文件所用的字符集,默认值为Unicode,如果文件中要用到中文,就必须将此值设定为gb2312。

2、XML文件体

    文件体中包含的是XML文件的内容,XML元素是XML文件内容的基本单元。

    一个元素包含一个起始标记、一个结束标记以及标记之间的数据内容。

XML元素格式如下:

<标记名称 属性名1="属性值1" 属性名1="属性值1" ……>内容</标记名称>

    所有的数据内容都必须在某个标记的开始和结束标记内,而每个标记又必须包含在另一个标记的开始与结束标记内,形成嵌套式的分布,只有最外层的标记不必被其他的标记所包含。最外层的是根元素(Root),又称文件(Document)元素,所有的元素都包含在根元素内。

三、XML基本语法

1、注释

    XML的注释与HTML的注释相同,以“<!--”开始,以“-->”结束。

2、区分大小写

    在HTML中是不区分大小写的,而XML区分大小写,包括标记,属性,指令等。

3、标记

    XML标记与HTML标记相同,“<”表示一个标记的开始,“>” 表示一个标记的结束。XML中只要有起始标记,就必须有结束标记,而且在使用嵌套结构时,标记之间不能交叉。

    在XML中不含任何内容的标记叫做空标记,格式为:<标记名称/>

4、属性

    XML属性的使用与HTML属性基本相同,但需要注意的是属性值要加双引号。

5、实体引用

    实体引用是指分析文档时会被字符数据取代的元素,实体引用用于XML文档中的特殊字符,否则这些字符会被解释为元素的组成部分。例如,如果要显示“<”,需要使用实体引用“<”否则会被解释为一个标记的起始。

6、CDATA

    在XML中由一个特殊的标记CDATA,在CDATA中所有文本都不会被XML处理器解释,直接显示在浏览器中,使用方法如下:

<![CDATA[这里的内容可以直接显示]]>

 

7、处理指令

    处理指令使用来给处理XML文件的应用程序提供信息的,处理指令的格式如下:

<?处理指令名称 处理指令信息?>

XML声明就是一条处理指令:

<?xml version="1.0" encoding="gb2312"?>

其中,“xml”是处理指令名称,version="1.0" encoding="gb2312"是处理指令信息。

四、QtXml模块简介

    QT中提供了QtXml模块来进行XML文档的处理QtXml模块提供三种对XML文档的解析方法:

A、DOM方法,可以进行读写;

B、SAX方法,可以进行读取;

C、基于流的方法,分别使用QXmlStreamReaderQXmlStreamWriter进行读取和写入。  
   使用XML模块,在.pro文件中添加QT += xml,并加如相应的头文件#include <QDomDocument>或者#include <QXmlStreamReader>。


本文出自 “生命不息,奋斗不止” 博客,谢绝转载!

以上是关于2021-04-15qt对XML文件的使用的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 QXmlStreamReader 解析包含对其他 XML 文件的引用的 XML 文件?

如何使用 Qt 从磁盘读取 XML 文件?

为啥我不能使用 Qt 中的 QXmlStreamReader 解析 XML 文件?

QT开发(四十一)——XML文件解析基础

Qt 史上最详细 - “操作XML文件” - 笔记

Qt的Xml操作QDomDocument