Qt之解析XML元素.doc_第1页
Qt之解析XML元素.doc_第2页
Qt之解析XML元素.doc_第3页
Qt之解析XML元素.doc_第4页
Qt之解析XML元素.doc_第5页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Qt之解析XML元素(QXmlStreamReader)简述对于 XML 的内容,通常情况下,我们只关心 XML 元素的解析。这时,可以通过 QXmlStreamReader 中的便利函数 readNextStartElement() 来实现。简述详细介绍使用更多参考详细介绍之前使用的方式主要使用 readNext() 来读取下一个标记,并返回对应的类型。QXmlStreamReader xml;.while (!xml.atEnd() xml.readNext(); . / 做处理if (xml.hasError() . / 做错误处理这对于读取注释、字符、DTD、结束标签等类型比较方便。当只关心 XML 元素的解析,这时,此种方式就显得比较复杂了,下面介绍一种简单方式。在介绍之前,先明确一个概念:当前元素: 当前元素是匹配最近解析的开始元素的元素,其中匹配的结束元素尚未到达。当解析器到达结束元素时,当前元素将成为父元素。下面,主要用到 QXmlStreamReader 的两个接口:bool readNextStartElement()读取,直到当前元素的下一个开始元素。当达到开始元素时,返回 true;当达到结束元素或发生错误时,返回 false。void skipCurrentElement()读取,直到当前元素的结尾,跳过任何子节点。此函数对于跳过未知元素非常有用。使用为了便于演示,使用上节生成的格式化 XML(Blogs.xml):!DOCTYPE Blogs 一去丶二三里 /liang19890820 青春不老,奋斗不止!&Copyright;!CDATA368241647> 封装一个解析类 XMLReader,XMLReader.h 如下所示:#ifndef XMLREADER_H#define XMLREADER_H#include class XMLReaderpublic: XMLReader(); bool read(QIODevice *device); QString errorString() const; / 错误信息private: void readXBEL(); / 读取根元素 void readBlog(); / 读取元素 void readAuthor(); / 读取元素 void readHOME(); / 读取元素 void readInstruction(); / 读取元素 QXmlStreamReader xml;#endif / XMLREADER_HXMLReader.cpp 如下所示:#include XMLReader.h#include #define ROOT_ELEMENT Blogs#define BLOG_ELEMENT Blog#define AUTHOR_ELEMENT QString:fromLocal8Bit(作者)#define HOME_ELEMENT QString:fromLocal8Bit(主页)#define INSTRUCTION_ELEMENT QString:fromLocal8Bit(个人说明)#define VERSION_ATTRIBUTE VersionXMLReader:XMLReader()bool XMLReader:read(QIODevice *device) xml.setDevice(device); if (xml.readNextStartElement() QString strName = ().toString(); if (strName= ROOT_ELEMENT) / 获取根元素 QXmlStreamAttributes attributes = xml.attributes(); if (attributes.hasAttribute(VERSION_ATTRIBUTE) / 存在属性 Version QString strVersion = butes.value (VERSION_ATTRIBUTE).toString(); if (strVersion = 1.0) / 可以作为版本兼容性判断 qDebug() Version : strVersion; readXBEL(); else xml.raiseError(The file is not an XBEL version 1.0 file.); else xml.raiseError(XML file format error.); return !xml.error();/ 错误信息QString XMLReader:errorString() const return QString(Error:%1 Line:%2 Column:%3) .arg(xml.errorString() .arg(xml.lineNumber() .arg(xml.columnNumber();/ 读取根元素 void XMLReader:readXBEL() Q_ASSERT(xml.isStartElement() & ().toString() = ROOT_ELEMENT); while (xml.readNextStartElement() if (().toString() = BLOG_ELEMENT) readBlog(); else xml.skipCurrentElement(); / 跳过当前元素 / 读取元素 void XMLReader:readBlog() Q_ASSERT(xml.isStartElement() & ().toString() = BLOG_ELEMENT); while (xml.readNextStartElement() if (().toString() = AUTHOR_ELEMENT) readAuthor(); else if (().toString() = HOME_ELEMENT) readHOME(); else if (().toString() = INSTRUCTION_ELEMENT) readIstruction(); xml.skipCurrentElement(); / 跳过当前元素 / 读取元素 void XMLReader:readAuthor() Q_ASSERT(xml.isStartElement() & ().toString() = AUTHOR_ELEMENT); QString strAuthor = xml.readElementText(); qDebug() QString:fromLocal8Bit(作者:%1).arg(strAuthor);/ 读取元素 void XMLReader:readHOME() Q_ASSERT(xml.isStartElement() & ().toString() = HOME_ELEMENT); QString strHome = xml.readElementText(); qDebug() QString:fromLocal8Bit(主页:%1).arg(strHome);/ 读取元素 void XMLReader:readInstruction() Q_ASSERT(xml.isStartElement() & ().toString() = INSTRUCTION_ELEMENT); QString strInstruction = xml.readElementText(); qDebug() QString:fromLocal8Bit(个人说明:%1).arg(strInstruction);使用时,调用 readXML() 即可。#include #include XMLReader.h/ 解析 XMLvoid readXML() QString strFile(Blogs.xml); QFile file(strFile); if (!file.open(QFile:ReadOnly | QFile:Text) / 以只读模式打开 qDebug() QString(Cannot read

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论