Qt读写xml格式字符串

转自:https://blog.csdn.net/lovebird_27/article/details/50205995

Xml 简介

W3CXML教程
XML是ExtensibleMarkup Language的缩写,即可扩展标记语言。它是一种用来创建的标记的标记语言。使用XML标记语言可以做到数据或数据结构在任何编程语言环境下的共享。
XML 被设计用来传输和存储数据
HTML 被设计用来显示数据。
XML解析器是读取XML文档并提供对文档内容的访问的软件模块

Qt 读取 XML 文档的方法

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

Qt生成 XML 文档方法

A QXmlStreamWriter与QXmlStreamReader相对应。XML流的方法
B DOM 方式,首先在内存中生成 DOM 树,然后将 DOM 树写入文件。
C 纯手工生成 XML 文档。

Qt中DOM的使用

//xml中的XML说明对应QDomProcessingInstruction

//xml中的元素对应QDomElement类

//xml中的属性对应QDomArr类

//xml中的文本内容对应QDomText类

//Qt中,所有的Dom节点,比如说明,元素,属性和文本等,都使用QDomNode来表示

//文档本身用 QDomDocument 类表示

//访问XML文件

    // 新建QDomDocument类对象,它代表一个XML文档

    QDomDocument doc;


    // 定义一个文件对象

    QFile file("../myDOM1/my.xml");

    //setContent()函数设置整个文档内容,将xml文档内容解析为一个DOM树

    doc.setContent(&file);  


    // 获得doc的第一个结点,即XML说明

    QDomNode firstNode = doc.firstChild();  //若换为lastChild() 指的是根元素


    // 返回根元素

    QDomElement docElem = doc.documentElement();

    // 返回根节点的第一个子结点

    QDomNode n = docElem.firstChild();  //lastChild()获取最后一个节点  输出的是book03


    // 转到下一个兄弟结点

    n = n.nextSibling();  //使用previousSibling访问前一个节点

//创建XML文件

    // 添加处理指令即XML说明

    QDomProcessingInstruction instruction;

    instruction = doc.createProcessingInstruction("xml", "version=\"1.0\" encoding=\"UTF-8\"");

    doc.appendChild(instruction);  //添加在最后

    // 添加元素

    QDomElement book = doc.createElement(QString("图书"));



    // 添加属性及其值

    QDomAttr id = doc.createAttribute(QString("编号"));

    id.setValue(QString("1"));

    book.setAttributeNode(id);

    //文本及其文本值

    QDomText text;

    text = doc.createTextNode(QString("Qt"));

Qt中SAX的使用

SAX(simple API for XML)为XML解析器提供了一个基于事件的标准接口。在Qt中支持SAX2不支持java中的SAX1

Qt中XML流的使用

Qt中用了两个类来读取和写入XML文档( QXmlStreamWriter与QXmlStreamReader),前面讲到过在读取XML文档时是通过readNext()函数获取下一个记号,返回的是记号
类型,它由 QXmlStreamReader::TokenType 定义,具体记号类型如图:

//QXmlStreamReader 解析文档

    QFile file("../myXmlStream/my.xml");

    QXmlStreamReader reader;

    // 设置文件,这时会将流设置为初始状态

    reader.setDevice(&file);

    while (!reader.atEnd()) {

        // 读取下一个记号,它返回记号的类型

        QXmlStreamReader::TokenType type = reader.readNext();  //所有取值表17-6 P417

        // 下面便根据记号的类型来进行不同的输出

        if (type == QXmlStreamReader::StartDocument)



        if (type == QXmlStreamReader::StartElement) { //元素的起始



            if (reader.attributes().hasAttribute("id"))//如果有属性为ID的元素



        }

        if (type == QXmlStreamReader::EndElement)   //元素的截止



        if (type == QXmlStreamReader::Characters && !reader.isWhitespace()) //文本内容



    }

//QXmlStreamWriter 创建文档

    QFile file("../myXmlStream/my2.xml");

    QXmlStreamWriter stream(&file);

    //设置自动格式,会自动换行和添加缩进

    stream.setAutoFormatting(true);

    //自动添加首行的XML说明

    stream.writeStartDocument();

    //添加元素

    stream.writeStartElement("book"); //起始元素

    stream.writeAttribute("href", "http://qt.nokia.com/");

    stream.writeTextElement("title", "Qt Home"); //文本元素   使用这个关闭前一个打开的元素    

    stream.writeEndElement();

    stream.writeEndDocument();

你可能感兴趣的:(Json_xml格式数据)