QT解析XML文件
一.QT提供三种处理XML文件方式
DOM(DocumentObject Model):将整个 XML 文档读入内存,构建成一个树结构,允许程序在树结构上向前向后移动导航,这是与另外两种方式最大的区别,也就是允许实现多次解析器(对应于 QXmlStreamReader 的一次解析器)。DOM 方式带来的问题是需要一次性将整个 XML 文档读入内存,因此会占用很大内存,这样就使得它不适合处理较大的文件。DOM是由 W3C 提出的一种处理 XML 文档的标准接口。
SAX(Simple API forXML):提供大量虚函数,以事件的形式处理 XML 文档。这种解析办法主要是由于历史原因提出的,为了解决 DOM 的内存占用提出的(在现代计算机上,这个一般已经不是问题了),它提供了比 DOM更简单的接口,并且它不需要将整个 XML 文档一次性读入内存,这样便可以用来读取较大的文件。SAX 方法只适用于读取 XML 文档。
QXmlStreamReader: QXmlStreamReader 类提供了一个快速的解析器通过一个简单的流API 来读取格式良好的 XML文档,它是作为 Qt 的 SAX 解析器的替代品的身份出现的,特别适合于实现一次解析器(所谓“一次解析器”,可以理解成我们只需读取文档一次,然后像一个遍历器从头到尾一次性处理 XML 文档,期间不会有反复的情况,也就是不会读完第一个标签,然后读第二个,读完第二个又返回去读第一个,这是不允许的)。使用 QXmlStreamReader 是 Qt 中最快最方便的读取 XML 的方法。因为 QXmlStreamReader 使用了递增式的解析器,适合于在整个 XML 文档中查找给定的标签、读入无法放入内存的大文件以及处理 XML 的自定义数据。
二.代码
CSAXPARSE类
H文件
#ifndefCSAXPARSE_H
#defineCSAXPARSE_H
#include<QXmlDefaultHandler>
classCSAXParse:publicQXmlDefaultHandler
{
public:
CSAXParse();
voidSetXMLData(char*xmlData);
protected:
boolstartElement(constQString&namespaceURI,
constQString&localName,
constQString&qName,
constQXmlAttributes&atts);
boolendElement(constQString&namespaceURI,
constQString&localName,
constQString&qName);
boolcharacters(constQString&ch);
boolfatalError(constQXmlParseException&exception);
};
#endif//CSAXPARSE_H
CPP文件
#include"CSaxParse.h"
#include<QDebug>
CSAXParse::CSAXParse()
{
}
voidCSAXParse::SetXMLData(char*xmlData)
{
QXmlInputSourceinput;
QStringdata=xmlData;
qDebug()<<data;
input.setData(data);
QXmlSimpleReaderreader;