суббота, 19 апреля 2014 г.

Извлечение ответов на вопросы через MoodleXML

У Moodle есть довольно хороший механизм экспорта - MoodleXML, который позволяет экспортировать вопросы в одноименном формате. В нем хранятся текст вопроса, список ответов, их атрибуты - словом все, что необходимо при восстановлении вопроса.

Возникла задача - извлечь ответы на вопросы из данного формата. Вообще, на первый взгляд, для этого - достаточно регекса, который бы доставал текст из тегов вида "<text></text>". Беда в том, что такие теги не всегда относятся, к ответам на вопросы, а могут участвовать - например в тексте, который показывается в случае совпадения ответа студента с заданным.

Для решения такой задачи можно использовать XQuery и конкретно, такую вещь как MXQuery. Хоть она далека от идеальной, но выдернуть данные на ней - одна строка:



java -jar mxquery-15.jar -s omit-xml-declaration=true -i "for $act in doc(\"questions.xml\")/quiz/question/answer/text return $act" -o 1.txt


К большому сожалению - это не все. Дело в том, что данные вернутся с тегами и текст вопросов будет проэскапирован для работы с XML. При попытке, сделать все через MXQuery возникли определенные проблемы - он падал с ошибкой, альтернативный GNU Kawa работал еще хуже, ломаясь посередине. Для финального получения данных имеет смысл использовать скрипт на PHP, к примеру:

$data = file_get_contents("php://stdin");
$matches = array();
$result = preg_match_all("/<text>([^<]+)<\/text>/", $data, $matches); 
$a = function($o) { return html_entity_decode($o); }; 
$matches = array_map($a, $matches[1]); 
echo implode("\n", $matches);