天天看点

一个基于XML的考试系统的设计与实现

            这篇文章想写很久了,只是一直都没有时间,现在公司忙完了,人也毕业了,时间有了,所以就可以写写东西了.

            这个系统的基本要求其实很简单,如下:

             1.可以生成试卷(最好提供多种生成方式)

              2.提供试题的管理功能(增,删...)

              3.提供一般的系统管理功能(登陆,权限控制...)

              恩,很简单是吧,但是今天我讨论的不是这个系统的实现,而是这个系统的设计.在做这个系统的时候我刚看了一些ORM的书,然后我就想,我们可不可以用类图来指导数据库的实现了?于是我就先建立了类图,如下:

一个基于XML的考试系统的设计与实现

                  很简单是吧,对就是这么简单的一个类图.由于这个系统要涉及到生成XML文件,然后在用XSLT解释为HTML,所以这个时候我就按照类图定义了XML文件的结构,然后在写了一个样式文件.然后再去实现这个系统.这个时候问题来了.同学说我要可以自定义题目.XML文件如下:

         <?xml version="1.0" encoding="gb2312" standalone="yes"?> <?xml-stylesheet type="text/xsl" href="web.xsl" target="_blank" rel="external nofollow" ?> <Exanmination Writer="hrmai" Score="100" WorkTime="100分钟" Subject="数学" ID="1098789"> <Title>2008年度数学综合测试试卷</Title> <DaTi Score="30" Count="10" Type="选择题"> <TiMu> <Body>题目内容</Body> <Chioces Count="4"> <Chioce>A</Chioce> <Chioce>B</Chioce> <Chioce>C</Chioce> <Chioce>D</Chioce> </Chioces> <Answers Count="2"> <Answer>A</Answer> <Answer>B</Answer> </Answers> </TiMu> <TiMu> <Body>题目内容</Body> <Chioces Count="4"> <Chioce>A</Chioce> <Chioce>B</Chioce> <Chioce>C</Chioce> <Chioce>D</Chioce> </Chioces> <Answers Count="1"> <Answer>A</Answer> </Answers> </TiMu> <TiMu> <Body>题目内容</Body> <Chioces Count="4"> <Chioce>A</Chioce> <Chioce>B</Chioce> <Chioce>C</Chioce> <Chioce>D</Chioce> </Chioces> <Answers Count="1"> <Answer>A</Answer> </Answers> </TiMu> </DaTi> <DaTi Score="40" Count="4" Type="计算题"> <TiMu Count="2"> <Body>计算题</Body> <TiMu> <Body>body</Body> <Answers Count="1"> <Answer>fjkasjd</Answer> </Answers> </TiMu> </TiMu> <TiMu Count="1"> <Body>计算题词2</Body> <Answers Count="1"> <Answer>答案</Answer> </Answers> </TiMu> </DaTi> </Exanmination>

              XSLT文件如下:

            <?xml version="1.0" encoding="utf-8"?>

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/">     <html>      <head>       <title>       <xsl:value-of select="/Exanmination/Title"></xsl:value-of></title>       <h2 align="center">       <xsl:value-of select="/Exanmination/Title"></xsl:value-of>       </h2>       <h3 align="center">       <b>科目:       <xsl:value-of select="/Exanmination/@Subject"></xsl:value-of>   考试时间:<xsl:value-of select="/Exanmination/@WorkTime"></xsl:value-of>   总分<xsl:value-of select="/Exanmination/@Score"></xsl:value-of></b></h3>      </head>      <body>      <xsl:apply-templates select="Exanmination"></xsl:apply-templates>      </body>     </html>     </xsl:template>     <xsl:template match="Exanmination">     <p>     <xsl:apply-templates select="DaTi"/>     </p>     </xsl:template>     <xsl:template match="DaTi">     <b>     <xsl:value-of select="@Type"></xsl:value-of>共     <xsl:value-of select="@Count"></xsl:value-of>题           满分<xsl:value-of select="@Score"></xsl:value-of>     </b>     <br/>     <p>     <xsl:apply-templates select="TiMu"></xsl:apply-templates>     </p>     </xsl:template>     <xsl:template match="Timu">     <xsl:value-of select="Body"></xsl:value-of><br/>     <p><xsl:apply-templates select="Chioces"></xsl:apply-templates></p>     <!--<p>     <xsl:apply-templates select="TiMu"></xsl:apply-templates></p>-->     <p>     <xsl:apply-templates select="Answers"></xsl:apply-templates></p>          </xsl:template>     <xsl:template match="Chioces">     <p>     <xsl:apply-templates select="Chioce"></xsl:apply-templates>     </p>     </xsl:template>     <xsl:template match="Answers">     <p>     <xsl:apply-templates select="Answer"></xsl:apply-templates>     </p>     </xsl:template>     <xsl:template match="Chioce">     <xsl:value-of select="."></xsl:value-of><br/>     </xsl:template>     <xsl:template match="Answer">     <xsl:value-of select="."></xsl:value-of><br/>     </xsl:template>                   </xsl:stylesheet>

        很简单是吧,我们只要用工厂模式,将题目类作为父类,实际题目作为子类,或者按照OO的思想将题目类抽象为一个接口,多么完美.......但是不要忘记了,我们要的是自定义题目类型,不是你写完然后让客户选.但是我们能做什么,对着这样的一个类图?对着按照这个类图已经实现了一般的系统.但是我也是按照上面的想法来想的,但是后来看了一下,发现如果这样做整个系统都要重构,基本上等于推倒了重来.所以当时我的回答是工程量太大.

        那么是不是就没有办法了?其实不是的,只要我们不用OO的思想以上的类图完全可以做到自定义题目的这样一个功能.我们改变一下数据库的结构,原来数据库中存放数据为题目内容为一个表格:T_题目;题目类型为一个表格:T_类型.而T_类型所有的字段为两个,题目类型名称和题目类型ID.如果我们要做上面的功能添加,我们只要在T_类型表里面加一个供XSLT解释用的字段就可以了,这个字段将会用来标识每一钟类型的题目,这样我们就可以用这个类型来度取XML文件中的数据了.譬如,我们有一个新建题目类型1,标识为NEW1,那么我们可以这样来表现这个东西:

<xsl:apply-template select="NEW1">新建题目类型1</....>

         这样我们可以使用户只要掌握一般的XSLT文件编写就可以了,如果真的不行,找一个网管,系管,估计也可以完成这项任务.

        那么这样做有什么好处了?其实好处很明显,就是所有类型的题目在系统中都是抽象的题目,所以用户喜欢怎么定义就怎么定义.如果用工厂模式,我们要写多少类?

        让我们在看一下上面的类图,我们会发现,这个XML文件的生成很简单,只要没一个实例解释自己就行了.OO的威力就在这里.

        好了,以上是我做这个系统的时候的感想,有什么指正和不足请提出.

上一篇: XML实现分页
下一篇: 浅谈栈帧