前面介绍了题库的实现。有了题库就可以出题考试了。下面介绍试卷部分的设计和实现。首先看下这部分的详细类图4-13
4.4 试卷的设计和实现(xml+xlst生成html试卷)

图4-13 试卷模块类图

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

4.4 试卷的设计和实现(xml+xlst生成html试卷)public virtual string GetContentXML()
); 
         builder.Append(
"<Answer><![CDATA[" + Answer + "]]></Answer>");
4.4 试卷的设计和实现(xml+xlst生成html试卷)        builder.Append(GetChoicesXML());
4.4 试卷的设计和实现(xml+xlst生成html试卷)        builder.Append(
"</" + QuestionType + ">");
4.4 试卷的设计和实现(xml+xlst生成html试卷)
4.4 试卷的设计和实现(xml+xlst生成html试卷)         
return builder.ToString();
4.4 试卷的设计和实现(xml+xlst生成html试卷)}

4.4 试卷的设计和实现(xml+xlst生成html试卷)下面是Question类的GetQuestionXML方法实现
4.4 试卷的设计和实现(xml+xlst生成html试卷)        
public string GetQuestionXML()

注意注释部分说明了对象生成自己的XML格式时候,又是如何包含子对象XML内容。与此类似,QuestionContainerXML生成方法包含了对Question对象的XML的添加。Paper则包含了QuestionContainerXML内容的添加。最后看看调用Paper对象的GetPaperXML方法返回的整张试卷的XML格式内容。为了简化这里假设Paper对象只有一个大题QuestionContainer,单选题。该大题只有一个Question对象。Question对象引用的是一个JianDaContent对象。由此可以看出一个Paper对象是怎样生成自己的XML格式的。先来看看这个Paper对象和其相关子对象的对象图4-14
4.4 试卷的设计和实现(xml+xlst生成html试卷)

图4-14 试卷对象图

下面是这些对象调用paper对象的GetPaperXML方法返回的XML。注意格式是经过修改过的。这里加上了换行。如果没加的话就会只有一行。

4.4 试卷的设计和实现(xml+xlst生成html试卷)<Paper PaperId="14" Score="1" ScoreValue="0">
4.4 试卷的设计和实现(xml+xlst生成html试卷)  
<QuestionContainer Title="单选题" ScoreValue="1" Score="0" Count="1">
4.4 试卷的设计和实现(xml+xlst生成html试卷)    
<Question ID="61" ScoreValue="1"  Score="0" IsScored="True">
4.4 试卷的设计和实现(xml+xlst生成html试卷)      
<StudentAnswer><![CDATA[3]]></StudentAnswer>
4.4 试卷的设计和实现(xml+xlst生成html试卷)      
<JianDa>
4.4 试卷的设计和实现(xml+xlst生成html试卷)        
<Content><![CDATA[1+1=?]]></Content>
4.4 试卷的设计和实现(xml+xlst生成html试卷)        
<Answer><![CDATA[2]]></Answer>
4.4 试卷的设计和实现(xml+xlst生成html试卷)      
</JianDa>
4.4 试卷的设计和实现(xml+xlst生成html试卷)    
</Question>
4.4 试卷的设计和实现(xml+xlst生成html试卷)  
</QuestionContainer>
4.4 试卷的设计和实现(xml+xlst生成html试卷)
</Paper>
4.4 试卷的设计和实现(xml+xlst生成html试卷)

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

4.4 试卷的设计和实现(xml+xlst生成html试卷)<?xml version="1.0" encoding="utf-8"?>
4.4 试卷的设计和实现(xml+xlst生成html试卷)
<xsl:stylesheet version="1.0"
4.4 试卷的设计和实现(xml+xlst生成html试卷)    xmlns:xsl
="http://www.w3.org/1999/XSL/Transform">
4.4 试卷的设计和实现(xml+xlst生成html试卷)    
<xsl:output method="html"/>
4.4 试卷的设计和实现(xml+xlst生成html试卷)    
<xsl:template match="Paper">
4.4 试卷的设计和实现(xml+xlst生成html试卷)      
<html>
4.4 试卷的设计和实现(xml+xlst生成html试卷)        
<body>
4.4 试卷的设计和实现(xml+xlst生成html试卷)           
<xsl:apply-templates select="QuestionContainer"/>
4.4 试卷的设计和实现(xml+xlst生成html试卷)        
</body>
4.4 试卷的设计和实现(xml+xlst生成html试卷)      
</html>
4.4 试卷的设计和实现(xml+xlst生成html试卷)     
4.4 试卷的设计和实现(xml+xlst生成html试卷)    
</xsl:template>
4.4 试卷的设计和实现(xml+xlst生成html试卷)  
<xsl:template match="QuestionContainer">
4.4 试卷的设计和实现(xml+xlst生成html试卷)    
<div class="Title">
4.4 试卷的设计和实现(xml+xlst生成html试卷)      
<xsl:value-of select="@Title"/>
4.4 试卷的设计和实现(xml+xlst生成html试卷)    
</div>
4.4 试卷的设计和实现(xml+xlst生成html试卷)    
<xsl:number format="1."/>
4.4 试卷的设计和实现(xml+xlst生成html试卷)    
<xsl:apply-templates select="Question"/>
4.4 试卷的设计和实现(xml+xlst生成html试卷)  
</xsl:template>
4.4 试卷的设计和实现(xml+xlst生成html试卷)  
<xsl:template match="Question">
4.4 试卷的设计和实现(xml+xlst生成html试卷)    
<div class="Question">
4.4 试卷的设计和实现(xml+xlst生成html试卷)      
<xsl:apply-templates select="JianDa"/>
4.4 试卷的设计和实现(xml+xlst生成html试卷)    
</div> 
4.4 试卷的设计和实现(xml+xlst生成html试卷)  
</xsl:template>
4.4 试卷的设计和实现(xml+xlst生成html试卷)    
<xsl:template match="JianDa">
4.4 试卷的设计和实现(xml+xlst生成html试卷)      
<div class="JianDa">
4.4 试卷的设计和实现(xml+xlst生成html试卷)        
<div class="Content">
4.4 试卷的设计和实现(xml+xlst生成html试卷)          
<pre>
4.4 试卷的设计和实现(xml+xlst生成html试卷)            
<xsl:value-of select="Content"/>
4.4 试卷的设计和实现(xml+xlst生成html试卷)          
</pre>
4.4 试卷的设计和实现(xml+xlst生成html试卷)        
</div>
4.4 试卷的设计和实现(xml+xlst生成html试卷)        
<div class="Input">
4.4 试卷的设计和实现(xml+xlst生成html试卷)          
<textarea name="{@ID}"  rows="8" style="width:100%">
4.4 试卷的设计和实现(xml+xlst生成html试卷)            
<xsl:value-of select="Answer"/>
4.4 试卷的设计和实现(xml+xlst生成html试卷)          
</textarea>
4.4 试卷的设计和实现(xml+xlst生成html试卷)        
</div>
4.4 试卷的设计和实现(xml+xlst生成html试卷)      
</div>
4.4 试卷的设计和实现(xml+xlst生成html试卷)    
</xsl:template>
4.4 试卷的设计和实现(xml+xlst生成html试卷)  
</xsl:stylesheet>
4.4 试卷的设计和实现(xml+xlst生成html试卷)
4.4 试卷的设计和实现(xml+xlst生成html试卷)下面代码说明了我们是如何生成html的
4.4 试卷的设计和实现(xml+xlst生成html试卷)    
public static string TranslateXMLToHtmlString(string XML, string xslFilePath)

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

下面是生成的html代码

4.4 试卷的设计和实现(xml+xlst生成html试卷)<html>
4.4 试卷的设计和实现(xml+xlst生成html试卷)  
<body>
4.4 试卷的设计和实现(xml+xlst生成html试卷)    
<div class="Title">单选题</div>1.<div class="Question">
4.4 试卷的设计和实现(xml+xlst生成html试卷)      
<div class="JianDa">
4.4 试卷的设计和实现(xml+xlst生成html试卷)        
<div class="Content">
4.4 试卷的设计和实现(xml+xlst生成html试卷)          
<pre>1+1=?</pre>
4.4 试卷的设计和实现(xml+xlst生成html试卷)        
</div>
4.4 试卷的设计和实现(xml+xlst生成html试卷)        
<div class="Input"><textarea name="" rows="8" style="width:100%">2</textarea></div>
4.4 试卷的设计和实现(xml+xlst生成html试卷)      
</div>
4.4 试卷的设计和实现(xml+xlst生成html试卷)    
</div>
4.4 试卷的设计和实现(xml+xlst生成html试卷)  
</body>
4.4 试卷的设计和实现(xml+xlst生成html试卷)
</html>
4.4 试卷的设计和实现(xml+xlst生成html试卷)





相关文章:

  • 2021-12-10
  • 2022-12-23
  • 2021-04-01
  • 2021-11-23
  • 2022-12-23
  • 2021-07-27
  • 2022-01-14
猜你喜欢
  • 2021-09-27
  • 2021-07-25
  • 2021-06-11
  • 2022-01-29
  • 2021-12-02
  • 2022-01-22
相关资源
相似解决方案