用QT产生报告的一种方案

方案简述
------------------------------------------------------------------------------------------------
(1)有一个xml文件作为报告的模板F,各种需要动态显示的数据在模板中有唯一的标识,运行时可以根据这些标识来获得实际数据R;  
(2)使用xml的库,解析模板F,并根据标识填充实际的动态数据R,将得到的数据按照XML标准存到一个数据X中;
(3)读取数据X,产生符合要求的报告。

QT解析XML文件的机制
-------------------------------------------------------------------------------------------------
使用三个类,分别是QXmlInputSource,QXmlReader和QXmlDefaultHandler,来完成XML文件的解析。
QXmlInputSource,用于封装待解析的XML文件,为QXmlReader提供输入数据。
QXmlReader是一个抽象类,提供接口,用来实现读取xml文件(即QXmlInputSource),并写到你指定的地方。QXmlReader目前唯一的子类就是QSimpleReader。如果对要对xml文件的内容感兴趣进行处理,如将数据保存到指定结构,就必须自己实现特定的处理类Handler,默认的有QXmlDefaultHandler,就是不作任何处理,你可以需要生成它的子类,加上自己的实现。

上面的过程可以写成下面的代码:
// 生成xml source
QXmlInputSource * source = new QXmlInputSource(file);

// 定义reader,并设定handler
QXmlSimpleReader reader;
Handler *handler = new Handler;
reader.setContentHandler(handler);
reader.setErrorHandler(handler);

// 进行解析,此时解析之后的处理结果会根据handler程序获得
reader.parse(source);


实现介绍
-------------------------------------------------------------------------------------------------
首先需要定义方案中提到的XML数据结构:
QDomDocument doc("report");
QDomElement root = doc.createElement("report");
doc.appendChild(root); 
这里看到QDomElement就是一个XML数据结构了,这个变量非常重要,一方面模板解析出来并填充实际数据后,就将这些内容放入这个变量;另一方面,声称实际报告时,则需要从这个变量中去读取数据。

然后使用QT机制(上面提到过的)来解析作为模板的xml文件:
QXmlInputSource source(file); 
QXmlSimpleReader xmlReader;
ReportXmlParser xmlParser(root); // 这个对象派生于QXmlDefaultHander,实际解析和读取数据的工作都要在它这里完成,并将内容存入root中
xmlReader.setContentHandler(&xmlParser); // 通过这个函数,实际上将XML模板特定的解析工作交给了xmlParser,QXmlSimpleReader用来解析xml本身结构
xmlReader.setErrorHandler(&xmlParser);
xmlReader.parse(source);     // 进行解析

解析过程中,ReportXMlParser类,作为QXmlDefaultHander类的派生,应该负责获得数据的数据,并更新到QDomElement变量root中去。

最后,读取QDomElement变量root,生成用户需要的报告。

你可能感兴趣的:(用QT产生报告的一种方案)