Qt4.7.0文档翻译:QXmlStreamReader类参考,QXmlStreamReader Class Reference
QXmlStreamReader类提供一个通过一个简单的流API来读取符合规范的XML的快速分析器。
QXmlStreamReader是对于Qt自己的SAX分析器 (参见 QXmlSimpleReader )的一个更快和更方便的替代品。在某些情况下 ,它也可能在那些原本会使用一个DOM树 的程序(参见 QDomDocument )中成为一个更快及更方便的替代品。 QXmlStreamReader从一个 QIODevice (参见 setDevice ())或者一个原始的 QByteArray (参见 addData ())读取数据 。
Qt提供 QXmlStreamWriter 用于写XML 。
一个流阅读器的基本概念是将一个XML 文档报告为一个由符号组成的流,类似于SAX。QXmlStreamReader 与 SAX 之间主要的不同在于这些XML 符号是 如何 被报告的。对于 SAX ,程序必须为了分析器的方便而提供从分析器接收所谓的XML 事件 的处理器(回调函数) 。对于 QXmlStreamReader ,程序的代码自己驱动这个循环过程并且在需要的时候从阅读器拉取 符号 ,一个接着一个。这是通过调用 readNext ()来实现的 , 此时阅读器从输入流读取直到它读完下一个符号,在那个时候它返回 tokenType ()。接下来一组包括 isStartElement ()和 text ()在内的便利函数可 被用来检查符号以获取关于什么东西被读取的信息。这种 拉取 的 实现方法的大优势在于用它来构建递归下降分析器的可能性 ,意味着你能 够将你的XML 分析代码轻易地分割为不同的方法或类。这使得在分析XML 时跟踪程序自己的状态变得非常容易 。
一个典型的使用QXmlStreamReader 的循环应该是这样的:
QXmlStreamReader xml;
...
while (!xml.atEnd()) {
xml.readNext();
... // do processing
}
if (xml.hasError()) {
... // do error handling
}
QXmlStreamReader是一个不包含在外部分析的实体的规范的 XML 1.0分析器。只要没有错误发生 ,程序的代码就可以得到如下保证 :对于规范的XML ,由流阅读器提供的数据满足W3C的标准。例如 , 你可以确定 :所有的标记 都是适当地嵌套和关闭的,对内部实体的引用 都被正确的替代文本所代替,并且属性 都被按照内部的DTD 子集进行了规范化和添加。
如果在分析的时候发生一个错误 ,那么 atEnd ()和 hasError ()返回真 ,并且 error ()返回所发生的错误 。 errorString () , lineNumber (), columnNumber ()和 characterOffset ()函数是用来构建一个对应的错误或警告消息的。为了简化程序代码 , QXmlStreamReader 包含一个 raiseError ()机制 ,它让你可以产生能触发所描述过的相同的错误处理过程的自定义错误。
QXmlStream书签示例 展示了如何用一个流阅读器来使用递归下降技术来阅读一个XML 书签文件( XBEL )。
QXmlStream理解并且解析XML 命名空间。例如 ,对于一个 StartElement , namespaceUri () 返回这个元素所在的命名空间 ,而 name ()返回这个元素的 本地 名字 。namespaceUri 和name 的组合唯一地确定一个元素。如果一个命名空间前缀没有在阅读器分析的XML 实体中声明 ,那么 namespaceUri是空的 。
如果你分析不按照XML 规范来使用命名空间或者根本不使用命名空间的XML 数据 ,那么你可以使用元素的 qualifiedName ()来代替。一个限定名是元素的 prefix ()加上冒号加上元素的局部 name () -正像元素在原始XML 数据中出现的那样。由于namespaceUri到 prefix 的映射是唯一的或者全局的 ,对于符合命名空间规范的XML 数据应当避免使用 qualifiedName ()。
为 了分析那些使用未声明的命名空间前缀的独立文档,你可以使用 namespaceProcessing 属性来完全关掉命名空间的处理。
QXmlStreamReader是一个增量分析器 。它可以处理由于文档是成块到达 (例如,来自多个文件,或者来自一个网络连接)而不能立即全部处理的情况。当阅读器在完整的文档 被分析之前就用完了数据时,它就报告一个 PrematureEndOfDocumentError 。无论是因为一个对 addData ()的调用或是因为更多的数据通过网络 device ()到达 ,当更多数据到达时,阅读器从 PrematureEndOfDocumentError 错误恢复并且在下次调用 readNext ()时继续分析新的数据。
例如 ,如果你的程序使用一个 网络访问管理器 从网络读取数据 ,你会向那个管理器发起一个 网络请求 并且接收一个 网络应答 作为回复 。由于一个 QNetworkReply 是一个 QIODevice ,你将它的 readyRead() 信号连接到一个自定义的信号槽,例如在 QNetworkAccessManager 的描述中展示的代码片段中的 slotReadyRead() 。在这个信号 槽里,你使用 readAll() 来读取所有可用的数据并且使用 addData ()来将它传递给XML 流阅读器 。接下来你调用你的自定义的分析函数 从阅读器读取XML 事件。
QXmlStreamReader 被设计为内存保守的,因为它不将整个XML 文档储存在内存中 ,而只在符号 被报告的时候 储存当前符号 。此外 , QXmlStreamReader在将一个XML 文档映射到一个方便和 Qt 风格的API 时 ,避免了像通常那样的很多小的字符串内存申请。它通过将所有的字符串数据报告为 QStringRef 而不是真正的 QString 对象来实现这一点 。 QStringRef 是一个围绕 QString 子字符串的轻量级的封装器 ,它在没有内存申请和引用计数开支的情况下提供 QString API 的一个子集 。在那些对象中的任何一个上调用 toString() 将返回一个等价的真正的 QString 对象 。
Your opinionsHxLauncher: Launch Android applications by voice commands