Skip to content

Commit

Permalink
Added parser modules for different question types.
Browse files Browse the repository at this point in the history
  • Loading branch information
rolfis committed Jan 15, 2021
1 parent 6fe7a80 commit fe9489d
Show file tree
Hide file tree
Showing 8 changed files with 144 additions and 11 deletions.
30 changes: 20 additions & 10 deletions src/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,13 +7,14 @@
__version__ = "0.1.0"
__license__ = "Apache"

from qti_parser import question_type
import argparse
import json
from logzero import logger
from lxml import etree

qti_resource = {
'assessments': []
'assessment': []
}

def main(args):
Expand All @@ -28,23 +29,32 @@ def main(args):
this_assessment = {
'id': xml_resource.get("identifier"),
'title': '',
'questions': []
'question': []
}
this_assessment_xml = this_assessment['id'] + "/" + this_assessment['id'] + ".xml"

for xml_item in etree.parse(this_assessment_xml).getroot().findall(".//{http://www.imsglobal.org/xsd/ims_qtiasiv1p2}item"):
xml_item_metadata = xml_item.find("{http://www.imsglobal.org/xsd/ims_qtiasiv1p2}itemmetadata/{http://www.imsglobal.org/xsd/ims_qtiasiv1p2}qtimetadata")
this_question = {
'id': xml_item.get("ident"),
'text': xml_item.find("{http://www.imsglobal.org/xsd/ims_qtiasiv1p2}presentation/{http://www.imsglobal.org/xsd/ims_qtiasiv1p2}material/{http://www.imsglobal.org/xsd/ims_qtiasiv1p2}mattext").text,
'answers': []
'id': str(xml_item.get("ident")),
'question_type': xml_item_metadata.find("{http://www.imsglobal.org/xsd/ims_qtiasiv1p2}qtimetadatafield[{http://www.imsglobal.org/xsd/ims_qtiasiv1p2}fieldlabel = 'question_type']/{http://www.imsglobal.org/xsd/ims_qtiasiv1p2}fieldentry").text,
'points_possible': xml_item_metadata.find("{http://www.imsglobal.org/xsd/ims_qtiasiv1p2}qtimetadatafield[{http://www.imsglobal.org/xsd/ims_qtiasiv1p2}fieldlabel = 'points_possible']/{http://www.imsglobal.org/xsd/ims_qtiasiv1p2}fieldentry").text,
'text': xml_item.find("{http://www.imsglobal.org/xsd/ims_qtiasiv1p2}presentation/{http://www.imsglobal.org/xsd/ims_qtiasiv1p2}material/{http://www.imsglobal.org/xsd/ims_qtiasiv1p2}mattext").text
}
this_assessment['questions'].append(this_question)
this_assessment['title'] = etree.parse(this_assessment_xml).getroot().find("{http://www.imsglobal.org/xsd/ims_qtiasiv1p2}assessment").get("title")

# multiple_choice_question
# short_answer_question
if this_question['question_type'] == "multiple_choice_question":
this_question['answer'] = question_type.multiple_choice.get_answers(xml_item)
elif this_question['question_type'] == "true_false_question":
this_question['answer'] = question_type.true_false.get_answers(xml_item)
elif this_question['question_type'] == "multiple_answers_question":
this_question['answer'] = question_type.multiple_answers.get_answers(xml_item)
elif this_question['question_type'] == "short_answer_question":
this_question['answer'] = question_type.short_answer.get_answers(xml_item)

this_assessment['question'].append(this_question)
this_assessment['title'] = etree.parse(this_assessment_xml).getroot().find("{http://www.imsglobal.org/xsd/ims_qtiasiv1p2}assessment").get("title")

qti_resource['assessments'].append(this_assessment)
qti_resource['assessment'].append(this_assessment)

qti_resource_json = json.dumps(qti_resource, indent = 2)
print(qti_resource_json)
Expand Down
1 change: 0 additions & 1 deletion src/parser/imsmanifest.py

This file was deleted.

1 change: 1 addition & 0 deletions src/qti_parser/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
from . import question_type
9 changes: 9 additions & 0 deletions src/qti_parser/question_type/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
"""
Question Types
"""

from . import multiple_answers
from . import multiple_choice
from . import true_false
from . import short_answer

29 changes: 29 additions & 0 deletions src/qti_parser/question_type/multiple_answers.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
"""
Multiple Answers
"""

from lxml import etree
from logzero import logger

def get_answers(xml):
""" Return an array of possible answers """
answers = []
correct_answers = []

for id in xml.findall(".//{http://www.imsglobal.org/xsd/ims_qtiasiv1p2}conditionvar/{http://www.imsglobal.org/xsd/ims_qtiasiv1p2}and/{http://www.imsglobal.org/xsd/ims_qtiasiv1p2}varequal"):
correct_answers.append(id.text)

try:
for xml_answer_item in xml.findall(".//{http://www.imsglobal.org/xsd/ims_qtiasiv1p2}response_label"):
answers.append(
{
'id': xml_answer_item.get("ident"),
'text': xml_answer_item.find("{http://www.imsglobal.org/xsd/ims_qtiasiv1p2}material/{http://www.imsglobal.org/xsd/ims_qtiasiv1p2}mattext").text,
'correct': True if xml_answer_item.get("ident") in correct_answers else False
}
)
except OSError as e:
logger.error("%s", e)
except etree.ParseError as e:
logger.error("XML parser error: %s", e)
return answers
29 changes: 29 additions & 0 deletions src/qti_parser/question_type/multiple_choice.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
"""
Multiple Choice
"""

from lxml import etree
from logzero import logger

def get_answers(xml):
""" Return an array of possible answers """
answers = []
correct_answers = []

for id in xml.findall(".//{http://www.imsglobal.org/xsd/ims_qtiasiv1p2}varequal"):
correct_answers.append(id.text)

try:
for xml_answer_item in xml.findall(".//{http://www.imsglobal.org/xsd/ims_qtiasiv1p2}response_label"):
answers.append(
{
'id': xml_answer_item.get("ident"),
'text': xml_answer_item.find("{http://www.imsglobal.org/xsd/ims_qtiasiv1p2}material/{http://www.imsglobal.org/xsd/ims_qtiasiv1p2}mattext").text,
'correct': True if xml_answer_item.get("ident") in correct_answers else False
}
)
except OSError as e:
logger.error("%s", e)
except etree.ParseError as e:
logger.error("XML parser error: %s", e)
return answers
27 changes: 27 additions & 0 deletions src/qti_parser/question_type/short_answer.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
"""
Short Answer
"""

from lxml import etree
from logzero import logger

def get_answers(xml):
""" Return an array of possible answers """
answers = []
i = 0

try:
for xml_answer_item in xml.findall(".//{http://www.imsglobal.org/xsd/ims_qtiasiv1p2}varequal"):
i += 1
answers.append(
{
'id': str(i),
'text': xml_answer_item.text,
'correct': True
}
)
except OSError as e:
logger.error("%s", e)
except etree.ParseError as e:
logger.error("XML parser error: %s", e)
return answers
29 changes: 29 additions & 0 deletions src/qti_parser/question_type/true_false.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
"""
True or False
"""

from lxml import etree
from logzero import logger

def get_answers(xml):
""" Return an array of possible answers """
answers = []
correct_answers = []

for id in xml.findall(".//{http://www.imsglobal.org/xsd/ims_qtiasiv1p2}varequal"):
correct_answers.append(id.text)

try:
for xml_answer_item in xml.findall(".//{http://www.imsglobal.org/xsd/ims_qtiasiv1p2}response_label"):
answers.append(
{
'id': xml_answer_item.get("ident"),
'text': xml_answer_item.find("{http://www.imsglobal.org/xsd/ims_qtiasiv1p2}material/{http://www.imsglobal.org/xsd/ims_qtiasiv1p2}mattext").text,
'correct': True if xml_answer_item.get("ident") in correct_answers else False
}
)
except OSError as e:
logger.error("%s", e)
except etree.ParseError as e:
logger.error("XML parser error: %s", e)
return answers

0 comments on commit fe9489d

Please sign in to comment.