XML(eXtensible Markup Language)是一种通用的文本格式,也叫可扩展标记语言。被广泛运用于数据交换和数据存储(虽然近年来 JSON 盛行,大有取代 XML 的趋势,但是对于一些已有系统和架构,比如 WebService,由于历史原因,仍旧会继续使用 XML)。
XML 由 World Wide Web Consortium(W3C)发布,作为 SHML(Standard Generalized Markup Language)的一种轻量级方言。XML 语法类似于 HTML,与后者的主要区别在于 XML 的标签不是固定的,而是可扩展的。XML的设计宗旨是传输和存储数据,而非显示(HTML)。
XML 由 World Wide Web Consortium(W3C)发布,作为 SHML(Standard Generalized Markup Language)的一种轻量级方言。XML 语法类似于 HTML,与后者的主要区别在于 XML 的标签不是固定的,而是可扩展的。XML的设计宗旨是传输和存储数据,而非显示(HTML)。
针对 XML 的通用处理,Qt4 提供了 QtXml 模块;针对 XML 文档的 Schema 验证以及 XPath、XQuery 和 XSLT,Qt4 和 Qt5 则提供了 QtXmlPatterns 模块。
Qt 提供了三种读取 XML 文档的方法:
- DOM(Document Object Model):将整个 XML 文档读入内存,构建成一个树结构,允许程序在树结构上向前向后移动导航,这是与另外两种方式最大的区别,也就是允许实现多次解析器(对应于QXmlStreamReader 的一次解析器)。DOM 方式带来的问题是需要一次性将整个 XML 文档读入内存,因此会占用很大内存,这样就使得它不适合处理较大的文件。DOM 是由 W3C 提出的一种处理 XML 文档的标准接口。
- SAX(Simple API for XML):提供大量虚函数,以事件的形式处理 XML 文档。这种解析办法主要是由于历史原因提出的,为了解决 DOM 的内存占用提出的(在现代计算机上,这个一般已经不是问题了),它提供了比 DOM 更简单的接口,并且它不需要将整个 XML 文档一次性读入内存,这样便可以用来读取较大的文件。SAX 方法只适用于读取 XML 文档。
- QXmlStreamReader:QXmlStreamReader 类提供了一个快速的解析器通过一个简单的流 API 来读取格式良好的 XML文档,它是作为 Qt 的 SAX 解析器的替代品的身份出现的,特别适合于实现一次解析器(所谓“一次解析器”,可以理解成我们只需读取文档一次,然后像一个遍历器从头到尾一次性处理 XML 文档,期间不会有反复的情况,也就是不会读完第一个标签,然后读第二个,读完第二个又返回去读第一个,这是不允许的)。使用 QXmlStreamReader 是 Qt 中最快最方便的读取 XML 的方法。因为 QXmlStreamReader 使用了递增式的解析器,适合于在整个 XML 文档中查找给定的标签、读入无法放入内存的大文件以及处理 XML 的自定义数据。
在 Qt4 中,这三种方式都位于 QtXml 模块中。Qt5 则将QXmlStreamReader/QXmlStreamWriter 移动到 QtCore 中,QtXml 则标记为“不再维护”,这已经充分表明了 Qt 的官方意向。
至于生成 XML 文档,Qt 同样提供了三种方式: