XML在Qt中的使用

前端之家收集整理的这篇文章主要介绍了XML在Qt中的使用前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

http://blog.csdn.net/lovebird_27/article/details/50205995

1 XML简介

XML是ExtensibleMarkup Language的缩写,即可扩展标记语言。它是一种用来创建的标记标记语言。使用XML标记语言可以做到数据或数据结构在任何编程语言环境下的共享。XML中有格式正规的XML和有效的XML。
XML文档的元素一般是由标记头、标记末和标记间的字符串数据构成。元素可包含其他元素、文本或者两者的混合物。元素也可以拥有属性。一般格式:<quote> Aquotion</quote>。元素中可以插入属性,但是属性值一定要用双引号。
XML解析器是读取XML文档并提供对文档内容的访问的软件模块。

DTD 的作用是定义 XML 文档的结构。它使用一系列合法的元素来定义文档结构。

Schema作用是定义一份XML文档的合法组件群,就像文档类型定义(外语缩写:DTD)的作用一样

若是不了解XML,可以先学习一下XML


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


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

Qt中DOM的使用

@H_301_103@//xml中的XML说明对应QDomProcessingInstruction @H_301_103@ @H_301_103@//xml中的元素对应QDomElement类 @H_301_103@ @H_301_103@//xml中的属性对应QDomArr类 @H_301_103@ @H_301_103@//xml中的文本内容对应QDomText类 @H_301_103@ @H_301_103@//Qt中,所有的Dom节点,比如说明,元素,属性和文本等,都使用QDomNode来表示 @H_301_103@ @H_301_103@//文档本身用 QDomDocument类表示 @H_301_103@ @H_301_103@//访问XML文件 @H_301_103@ @H_301_103@ //新建QDomDocument类对象,它代表一个XML文档 @H_301_103@ QDomDocument doc;
@H_301_103@ // 定义一个文件对象 @H_301_103@QFile file("../myDOM1/my.xml"); @H_301_103@ @H_301_103@
    //setContent()函数设置整个文档内容,将xml文档内容解析为一个DOM树
@H_301_103@ @H_301_103@ doc.setContent(&file);
@H_301_103@ @H_301_103@获得doc的第一个结点,即XML说明 @H_301_103@QDomNode firstNode = doc.firstChild(); //若换为lastChild()指的是根元素 @H_301_103@ @H_301_103@返回根元素 @H_301_103@QDomElement docElem doc.documentElement(); @H_301_103@ @H_301_103@返回根节点的第一个子结点 @H_301_103@ n docElem.firstChild();//lastChild()获取最后一个节点输出的是book03
@H_301_103@转到下一个兄弟结点 @H_301_103@ n n.nextSibling();//使用prevIoUsSibling访问前一个节点 @H_301_103@ //创建XML文件 @H_301_103@ @H_301_103@ @H_301_103@添加处理指令即XML说明 @H_301_103@QDomProcessingInstruction instruction; @H_301_103@ instruction doc.createProcessingInstruction("xml", "version=\"1.0\"encoding=\"UTF-8\""); @H_301_103@ doc.appendChild(instruction);//添加在最后 @H_301_103@ @H_301_103@添加元素 @H_301_103@ QDomElementbook=doc.createElement(QString("图书")); @H_301_103@
    //添加属性及其值
@H_301_103@QDomAttr id doc.createAttribute(QString("编号")); @H_301_103@ id.setValue(QString("1")); @H_301_103@ book.setAttributeNode(id); @H_301_103@ @H_301_103@//文本及其文本值 @H_301_103@QDomText text; @H_301_103@ text doc.createTextNode("Qt")); @H_301_103@ Qt中SAX的使用

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


QtXml模块中的事件处理类:

@H_301_103@ @H_301_103@bool readFile(const QString &fileName);//读入XML文件 @H_301_103@ @H_301_103@//readfile设置了文件的解析过程,Qt提供了一个简单的xml解析器QXmlSimpleReader,它是基于SAX,需要QXmlInputSource为其提供数据 @H_301_103@ @H_301_103@ @H_301_103@protected: @H_301_103@//4个事件 @H_301_103@ startElement( &namespaceURI, &localName,0);">//获取元素名与属性 @H_301_103@ &qName,128);">QXmlAttributes &atts); @H_301_103@ endElement( //结束时该元素想进行的操作 @H_301_103@ &qName); @H_301_103@ characters( &ch); //获取元素中的文本 @H_301_103@ fatalError(QXmlParseException &exception); //错误处理器 @H_301_103@ @H_301_103@ @H_301_103@ @H_301_103@//参数qName对应XML中的元素名,参数atts对应属性名,参数ch对应文本

Qt中XML流的使用

Qt中用了两个类来读取和写入XML文档(QXmlStreamWriter与QXmlStreamReader),前面讲到过在读取XML文档时是通过readNext()函数获取下一个记号,返回的是记号

类型,它由QXmlStreamReader::TokenType 定义,具体记号类型如图:


@H_301_103@ @H_301_103@//QXmlStreamReader解析文档 @H_301_103@"../myXmlStream/my.xml"); @H_301_103@ @H_301_103@QXmlStreamReader reader; @H_301_103@ @H_301_103@设置文件,这时会将流设置为初始状态 @H_301_103@ reader.setDevice(&file); @H_301_103@ @H_301_103@while (!reader.atEnd()) { @H_301_103@ 读取下一个记号,它返回记号的类型 @H_301_103@ QXmlStreamReader::TokenType type reader.readNext();//所有取值表17-6P417 @H_301_103@ @H_301_103@下面便根据记号的类型来进行不同的输出 @H_301_103@if (type ==StartDocument) @H_301_103@ @H_301_103@ @H_301_103@StartElement) {//元素的起始 @H_301_103@ @H_301_103@ (reader.attributes().hasAttribute("id"))//如果有属性为ID的元素 @H_301_103@ @H_301_103@ } @H_301_103@ @H_301_103@EndElement) //元素的截止 @H_301_103@ @H_301_103@ @H_301_103@Characters && !reader.isWhitespace())//文本内容 @H_301_103@ } @H_301_103@ @H_301_103@ @H_301_103@//QXmlStreamWriter 创建文档 @H_301_103@ QFile file( "../myXmlStream/my2.xml"); @H_301_103@QXmlStreamWriter stream(&file); @H_301_103@//设置自动格式,会自动换行和添加缩进 @H_301_103@ stream.setAutoFormatting(true); @H_301_103@//自动添加首行的XML说明<?xmlversion="1.0"encoding="UTF-8"?> @H_301_103@ stream.writeStartDocument(); @H_301_103@//添加元素 @H_301_103@ stream.writeStartElement("book");//起始元素 @H_301_103@ stream.writeAttribute("href",0);">"http://qt.nokia.com/"); @H_301_103@ stream.writeTextElement("title",0);">"QtHome");//文本元素使用这个关闭前一个打开的元素 @H_301_103@ stream.writeEndElement(); @H_301_103@ @H_301_103@ stream.writeEndDocument();

XML在Qt中三种方法解析的简单例子

原文链接:https://www.f2er.com/xml/293458.html

猜你在找的XML相关文章