前面介绍了题库的实现。有了题库就可以出题考试了。下面介绍试卷部分的设计和实现。首先看下这部分的详细类图4-13。
图4-13 试卷模块类图
首先Question对象包含分值、得分、学生答案和一个表示是否批改过的IsScored属性。并有一个对QuestionContent的引用。Questioin对象代表了某学生一张试卷上的一道题。QuestionContainer类表示的是试卷上的一个大题。比如单选题。一个大题也就是一个QuestionContainer对象,它是就是小题Question对象的集合。以此类推一张试卷也就是一个Paper对象,就是大题QuestionContainer对象的集合。注意QuesitonContainer和Paper的Score(得分)和ScoreValue(分值)都是通过对他们所有子对象Question对象的得分和分值计算得来的。Paper类的AutoScore方法是用来自动改卷的。该方法检查客观题学生答案和标准答案。根据分值给每个Question子对象自动打分。另外注意每个试卷相关的类都有一个GetxxxXML的方法。该方法就是返回对象自身的XML格式字符串。如QuestionContent类的GetContentXML实现如下




builder.Append("<Answer><![CDATA[" + Answer + "]]></Answer>");

















注意注释部分说明了对象生成自己的XML格式时候,又是如何包含子对象XML内容。与此类似,QuestionContainer的XML生成方法包含了对Question对象的XML的添加。Paper则包含了QuestionContainer的XML内容的添加。最后看看调用Paper对象的GetPaperXML方法返回的整张试卷的XML格式内容。为了简化这里假设Paper对象只有一个大题QuestionContainer,单选题。该大题只有一个Question对象。Question对象引用的是一个JianDaContent对象。由此可以看出一个Paper对象是怎样生成自己的XML格式的。先来看看这个Paper对象和其相关子对象的对象图4-14。
图4-14 试卷对象图
下面是这些对象调用paper对象的GetPaperXML方法返回的XML。注意格式是经过修改过的。这里加上了换行。如果没加的话就会只有一行。












为什么要让Paper生成XML格式呢?就是为了下一个目标生成html。在线考试系统是基于web的,最终的试卷要在学生的浏览器中显示。而浏览器能够只能显示html。所以我们必须将Paper对象格式化成html才能显示给学生。当然也可以利用Asp.net的控件绑定来实现,或者直接用Response.Write来向浏览器输出html格式的Paper内容。但是这两种方法都十分的繁琐和难于调试。利用xslt这门专门用来转换文档格式的语言处理这种转换将更简洁灵活。因为XML是平台独立的。所以我们可以先将我们的Paper对象转换成XML格式。下一步就可以利用xlst将XML转换成想要的其他的格式。这里对xlst的基础知识不做过多的介绍。来看一个简单的例子来说明试卷是如何从XML到html的。还是利用上面已经有的一小段XML。下面给出用到的xslt的实现代码Paper.xsl。






















































该方法有两个参数一个是XML片段字符串。另一个是xsl文件的站点路径。将上面出现的Paper对象的XML片段和Paper.xsl文件的路径作为参数就可以获得生成的html字符串。
下面是生成的html代码












