Giới thiệ u

Một phần của tài liệu TÌM HIỂU VÀ XÂY DỰNG HỆ THỐNG FRAMEWORK HỖ TRỢ CÁC HÌNH THỨC TRẮC NGHIỆM (Trang 136)

Automation là kỹ thuật cho phép tận dụng các tính năng của 1 ứng dụng có sẵn và tích hợp vào trong chương trình của mình.

Hệ thống của chúng em đòi hỏi phải kết xuất các đề thi ra file để phục vụ cho yêu cầu thi trên giấy, cũng như phải nhập được dữ liệu câu hỏi từ các định dạng file để tận dụng ngân hàng đề thi đã có từ trước đến nay.

Theo nhận xét thì định dạng file .doc và file .pdf là phổ biến nhất hiện nay cho việc lưu trữ ngân hàng đề thi, tuy nhiên đã có nhiều chương trình hỗ trợ cho việc chuyển qua lại giữa 2 định dạng file này. Thêm nữa, file .doc có thể dễ dàng được tạo ra vì MS Word là trình soạn thảo văn bản rất thân thiện, phổ biến. Vì vậy, chúng em quyết định sử dụng kỹ thuật automation để automate MS Word nhằm sử dụng trực tiếp các tính năng có sẵn của Word phục vụ cho yêu cầu nhập xuất/kết xuất ngân hàng đề thi, câu hỏi của hệ thống.

9.2.2 Các đối tượng trong MS Word

- Application chính là ứng dụng MS Word đang được gọi thực thi.

- Document là đại diện cho các văn bản Word đang quản lý. Khi mở hay tạo 1 văn bản mới chính là tạo nên 1 đối tượng document và thêm đối tượng này vào tập hợp các document của application hiện hành. Văn bản đang được trực tiếp xử lý là active document.

- Selection đại diện cho vùng văn bản đang được chọn. Khi không có gì được chọn thì selection chính là vị trí con trỏ. Selection có thể bao gồm nhiều vùng văn bản không liên tiếp nhau.

- Range đại diện cho 1 vùng văn bản liên tục được xác định bởi ký tự bắt đầu và ký tự kết thúc vùng văn bản. 1 document có thể được chứa nhiều range. Range có thể:

ƒ Chỉ chứa duy nhất vị trí con trỏ (điểm chèn) hay 1 đoạn văn bản hay toàn bộ document.

ƒ Gồm cả các ký tự không in được như là khoảng trắng, khoảng tab, dấu phân cách đoạn văn bản …

ƒ Chỉ tồn tại khi đoạn code tạo ra nó đang được thực thi.

- Bookmark cũng đại diện cho 1 vùng văn bản liên tục, được sử dụng để đánh dấu vị trí. Bookmark có thể chỉ là 1 điểm chèn, mà cũng có thể là toàn bộ văn bản. Bookmark có các đặc điểm sau:

ƒ Có thể có tên.

ƒ Được lưu cùng với document.

ƒ Mặc định là được ẩn đi.

9.2.3 Ngôn ngữ VBA (Microsoft Visual Basic for Applications)

Tất cả các ứng dụng của Microsoft Office đều có ngôn ngữ script của nó, đó chính là VBA. Ngôn ngữ này có thểđược sử dụng để thực hiện các nhiệm vụ trong

phải làm khi thực hiện automation là sử dụng các macro của chính MS Word ghi lại các thao tác muốn automate.

Ví dụ bạn muốn automate MS Word để tạo 1 file mới, gõ vào 1 đoạn text rồi lưu lại nhưng bạn không biết phải sử dụng các hàm nào. Bạn có thể thông qua các macro để biết được điều đó.

Trước tiên, bạn phải ghi lại 1 macro mới.

Hình 9-2 Record macro trong MS Word

Sau đó, bạn thực hiện các thao tác muốn automate rồi dừng việc ghi macro lại. Và cuối cùng, bạn chỉ việc xem MS Word đã thao tác như thế nào thông qua macro vừa ghi được.

9.2.4 Ứng dụng trong hệ thống

Để có thể thực hiện automation, trước tiên phải cho phép chương trình tham chiếu đến thư viện xử lý của Word.

Hình 9-5 Add reference đến Word Object Library trong .NET 9.2.4.1 Import

Thao tác import trong hệ thống cần phải xử lý cả việc import hình ảnh. Mà như đã biết, các hình ảnh được chèn vào trong file .doc thì sẽ được lưu cùng với file .doc đó. Do vậy, để lấy được hình cụ thể, chúng em phải tiến hành lưu tạm file .doc dưới dạng trang web, rồi tìm trong source của trang web liên kết đến hình ảnh cụ thểđể copy lưu vào trong cơ sở dữ liệu.

Object missing = System.Reflection.Missing.Value;

object saveFileName = uniqueFileName;

object fileFormat = Word.WdSaveFormat.wdFormatHTML;

// Luu vao file tam duoi dang html

wordApp.ActiveDocument.SaveAs( (adsbygoogle = window.adsbygoogle || []).push({});

ref saveFileName, ref fileFormat, ref missing, ref missing,

ref missing, ref missing, ref missing,

ref missing, ref missing, ref missing, ref missing, ref missing,

wordApp.ActiveDocument.Close(ref missing, ref missing, ref missing); StreamReader r = new StreamReader(uniqueFileName);

string str = r.ReadToEnd(); r.Close(); int n1 = str.IndexOf("<body"); char tempChar = '<'; while(tempChar != '>') { tempChar = str[n1]; n1++; } int n2 = str.IndexOf("</body>");

string strFinal = str.Substring(n1, n2 - n1);

Dựa vào các dấu phân cách quy định sẵn, chúng em sẽ tách được nội dung các câu hỏi, và trong mỗi câu hỏi sẽ lọc ra được đâu là nội dung hỏi và đâu ra nội dung các lựa chọn (đơn thuần chỉ là thao tác xử lý chuỗi). Cụ thể, một câu hỏi trong file muốn import phải có định dạng như sau: [!!!] Nội dung hỏi <!!!> Nội dung lựa chọn thứ 1 * <!!!> Nội dung lựa chọn thứ 2 <!!!> Nội dung lựa chọn thứ 3 <!!!> Nội dung lựa chọn thứ 4 * <!!!> Nội dung lựa chọn thứ 5 Trong đó:

- [!!!] là dấu quy định phân cách các câu hỏi. - <!!!> là dấu quy định phân cách các lựa chọn. - * là dấu quy định lựa chọn đúng.

- Số lựa chọn và số lựa chọn đúng là không có giới hạn.

Thông tin nội dung câu hỏi lấy được sẽđược sử dụng để xây dựng thành chuỗi xml và lưu vào CSDL.

9.2.4.2 Export

Hệ thống hỗ trợ việc export 1 đề thi ra file .doc theo 1 template đề thi có sẵn. Template đề thi được tạo ra theo ý thích của các giáo viên và được copy vào trong thư mục WordFile Temlates của hệ thống. 1 template đề thi phải đáp ứng các yêu cầu sau:

- Có 1 bookmark có tên là assName đặt tại vị trí giáo viên muốn hiển thị tên bài thi.

- Có 1 bookmark có tên là assHeader đặt tại vị trí giáo viên muốn hiển thị các ghi chú đầu bài thi (header)

- Có 1 bookmark có tên là assFooter đặt tại vị trí giáo viên muốn hiển thị các ghi chú cuối bài thi (footer)

- Có 1 bookmark có tên là assSections đặt tại vị trí giáo viên muốn bắt đầu hiển thị các section, các câu hỏi của bài thi.

- Phần nào giáo viên không muốn hiển thị thì bookmark đánh dấu phần đó không cần phải được tạo ra.

Khi có yêu cầu export 1 đề thi ra file, chương trình sẽ tìm vị trí các bookmark, nếu bookmark tồn tại trong file template được chọn thì chương trình sẽ ghi đoạn văn bản phù hợp vào vị trí bookmark đó.

foreach (Word.Bookmark brm in privateWordApp.ActiveDocument.Bookmarks)

if (brm.Name == "assHeader")

ReplaceBookmarkText("assHeader", privateAssessment.HeaderNote); Trường hợp đoạn văn bản cần ghi có chứa tag image (tức là phải chèn 1 hình vào file) thì chương trình sẽ thực hiện thêm 1 đối tượng Word.Shape vào tập hợp hình ảnh mà văn bản đang được xử lý quản lý. Khi lưu văn bản, các hình ảnh cũng sẽđược lưu trữ theo.

private void TypeString(Word.ApplicationClass privateWordApp, string

strText) {

int pos = strText.IndexOf("<img");

while (pos >= 0) {

privateWordApp.Selection.TypeText(strText.Substring(0, pos)); strText = strText.Remove(0, pos);

pos = strText.IndexOf("src="); strText.Remove(0, pos+1);

pos = strText.IndexOf("\"");

string image = strText.Substring(0, pos); Object oFalse = false;

Object oTrue = true; (adsbygoogle = window.adsbygoogle || []).push({});

Object oMissing = Type.Missing;

// them 1 hinh anh vao tap hop InlineShapes

privateWordApp.Selection.InlineShapes.AddPicture(image, ref oFalse, ref oTrue, ref oMissing);

pos = strText.IndexOf("/img>"); strText.Remove(0, pos); pos = strText.IndexOf("<img"); } privateWordApp.Selection.TypeText(strText); }

Chương 10 Tng kết

10.1 Kết luận

Sau thời gian nghiên cứu, tìm hiểu các hình thức trắc nghiệm và phát triển ứng dụng, đề tài đã đạt được các mục tiêu sau:

o Xây dựng được một cổng dịch vụ thi cử là một hệ thống liên hoàn phối hợp nhuần nhuyễn giữa môi trường web và windows trong việc quản lý ngân hàng câu hỏi, đề thi và tổ chức thi trắc nghiệm.

o Có một khung ứng dụng (framework) hết sức linh động, có tính tiến hóa cao giúp cho việc mở rộng và nâng cấp hệ thống thật sự dễ dàng và hiệu quả.

o Xây dựng được các ứng dụng trên web và trên windows tiện dụng, ổn định và nhiều tính năng hữu ích, có thểứng dụng được ngay trong thực tế trong việc soạn câu hỏi, đề thi trắc nghiệm và thực hiện việc đánh giá, kiểm tra nhanh chóng.

o Cấu trúc câu hỏi trắc nghiệm tuân theo đặc tả IMSQTI – một đặc tả XML, là đặc tả quốc tếđược sử dụng rộng rãi nhất trên thế giới. Nhờ đó, cơ sở dữ liệu ngân hàng câu hỏi của hệ thống có khả năng trao đổi, có thể phân phối hay sử dụng lại ở bất cứ hệ thống nào khác trên thế giới có sử dụng đặc tả này.

10.2 Hướng phát triển

™ Thêm nhiều loại câu hỏi thêm nữa

™ Hỗ trợ thêm nhiều phiên bản khác nhau cho từng loại câu hỏi

Phuï luïc A -Export database theo đặc t IMSQTI

Nội dung file XSLT làm nhiệm vụ export: <?xml version="1.0"?>

<xsl:stylesheet version="1.0"

xmlns:xsl="http://www.w3.org/1999/XSL/Transform" > <xsl:template match="@*|node()">

<xsl:apply-templates select="*" />

</xsl:template>

<xsl:template match="assessmentItem"> <xsl:copy>

<xsl:apply-templates select="@* | text() | node()" />

</xsl:copy> </xsl:template>

<xsl:template match="responseDeclaration"> <xsl:copy>

<xsl:apply-templates select="@* | text() | node()" />

</xsl:copy> </xsl:template>

<xsl:template match="responseDeclaration/node() | responseDeclaration/text()

| responseDeclaration/node()/node()

| responseDeclaration/text()/node()">

<xsl:copy> (adsbygoogle = window.adsbygoogle || []).push({});

<xsl:apply-templates select="@* | text() | node()" />

</xsl:copy> </xsl:template>

<xsl:template match="outcomeDeclaration"> <xsl:copy>

<xsl:apply-templates select="@* | text() | node()" />

</xsl:copy> </xsl:template>

<xsl:template match="itemBody"> <xsl:copy>

</xsl:template>

<xsl:template match="itemBody/questionView"> </xsl:template>

<xsl:template match="responseProcessing"> <xsl:copy>

<xsl:apply-templates select="@* | text() | node()" />

</xsl:copy> </xsl:template> <xsl:template match="@*"> <xsl:copy> <xsl:apply-templates select="*" /> </xsl:copy> </xsl:template>

<xsl:template match="text()"> <xsl:copy>

<xsl:apply-templates select="*" />

</xsl:copy> </xsl:template> </xsl:stylesheet>

Phuï luïc B - Phn lưu tr XML ca mt s dng câu hi trong

đặc t IMSQTI

o Câu hỏi inlineChoiceInteraction:

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

<assessmentItem identifier="choiceMultiple" title="Composition of Water"

adaptive="false" timeDependent="false"> <responseDeclaration identifier="RESPONSE" cardinality="multiple" baseType="identifier">

<correctResponse>

<value>H</value>

<value>O</value>

</correctResponse>

<mapping lowerBound="0" upperBound="2" defaultValue="-2">

<mapEntry mapKey="H" mappedValue="1"/>

<mapEntry mapKey="O" mappedValue="1"/>

<mapEntry mapKey="Cl" mappedValue="-1"/>

</mapping>

</responseDeclaration> (adsbygoogle = window.adsbygoogle || []).push({});

<outcomeDeclaration identifier="SCORE" cardinality="single" baseType="integer"/>

<itemBody>

<choiceInteraction responseIdentifier="MR01" shuffle="true" maxChoices="4">

<prompt>Which of the following elements are used to form water?</prompt>

<simpleChoice identifier="H"

fixed="false">Hydrogen</simpleChoice>

<simpleChoice identifier="He" fixed="false">Helium</simpleChoice>

<simpleChoice identifier="C" fixed="false">Carbon</simpleChoice>

<simpleChoice identifier="O" fixed="false">Oxygen</simpleChoice>

<simpleChoice identifier="N"

fixed="false">Nitrogen</simpleChoice>

<simpleChoice identifier="Cl"

fixed="false">Chlorine</simpleChoice>

</choiceInteraction> </itemBody>

o Câu hỏi textEntryInteraction:

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

<assessmentItem identifier="textEntry" title="Richard III (Take 3)"

adaptive="false" timeDependent="false">

<responseDeclaration identifier="RESPONSE" cardinality="single"

baseType="string">

<correctResponse>

<value>York</value>

</correctResponse>

<mapping defaultValue="0">

<mapEntry mapKey="York" mappedValue="1"/>

<mapEntry mapKey="york" mappedValue="0.5"/>

</mapping>

</responseDeclaration>

<outcomeDeclaration identifier="SCORE" cardinality="single"

baseType="float"/> <itemBody> (adsbygoogle = window.adsbygoogle || []).push({});

<p>Identify the missing word in this famous quote from Shakespeare's Richard III.</p>

<blockquote>

<p>Now is the winter of our discontent<br/> Made glorious summer by this sun of

<textEntryInteraction responseIdentifier="RESPONSE"

expectedLength="15"/>;<br/>

And all the clouds that lour'd upon our house<br/> In the deep bosom of the ocean buried.</p>

</blockquote> </itemBody> <responseProcessing template="http://www.imsglobal.org/xml/imsqti_item_v2p0/rpMapRespo nse" templateLocation="../RPTemplates/rpMapResponse.xml"/> </assessmentItem>

o Câu hỏi orderInteraction:

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

<assessmentItem identifier="order" title="Grand Prix of Bahrain"

adaptive="false" timeDependent="false">

<responseDeclaration identifier="RESPONSE"

cardinality="ordered" baseType="identifier">

<correctResponse>

<value>DriverC</value>

<value>DriverA</value>

<value>DriverB</value>

</correctResponse> </responseDeclaration>

<outcomeDeclaration identifier="SCORE" cardinality="single"

baseType="integer"/> <itemBody>

<orderInteraction responseIdentifier="RESPONSE"

shuffle="true">

<prompt>The following F1 drivers finished on the podium in the first ever Grand Prix of

Bahrain. Can you rearrange them into the correct finishing order?</prompt>

<simpleChoice identifier="DriverA">Rubens Barrichello</simpleChoice>

<simpleChoice identifier="DriverB">Jenson Button</simpleChoice>

<simpleChoice identifier="DriverC">Michael Schumacher</simpleChoice>

</orderInteraction> </itemBody>

<responseProcessing

template="http://www.imsglobal.org/xml/imsqti_item_v2p0/rpMatch Correct" templateLocation="../RPTemplates/rpMatchCorrect.xml"/> </assessmentItem> (adsbygoogle = window.adsbygoogle || []).push({});

TÀI LIU THAM KHO [1] www.msdn.microsoft.com [2] www.imsglobal.org [3] www.el.edu.net.vn [4] www.codeproject.com [5] www.dnzone.com [6] www.asp.net [7] www.w3.org

Một phần của tài liệu TÌM HIỂU VÀ XÂY DỰNG HỆ THỐNG FRAMEWORK HỖ TRỢ CÁC HÌNH THỨC TRẮC NGHIỆM (Trang 136)