Программа для создания тестов

Некоторое время назад я опубликовал здесь несколько online-тестов, для которых написал специальное web-приложение. Каждый тест базируется на простом xml-файле, который несложно набрать вручную в любом текстовом редакторе. Но не каждый способен «врукопашную» без ошибок набрать xml-документ, поэтому было создано приложение для удобства создания таких файлов:


Приложение написано на JavaFX+Groovy. Я специально решил потратить время на анализ возможностей стыковки этих двух скоростных языков. Оказалось, что организовать их совместную работу очень просто, не даром оба являются «разновидностями» Java. Если кого-то интересуют подробности — отвечу в каментах или отдельном топике. Здесь же остановлюсь на парсинге XML средствами JavaFX, о котором узнал всё в том же Питере во время доклада программиста из Гонконга Чака Мун Ли.

В обычной Java парсинг XML — дело давным давно отлаженное (концепция SAX), но поскольку занимаешься этим не каждый день, приходится каждый раз заглядывать в мануалы чтобы вспомнить синтаксис. В JavaFX всё гораздо проще. Допустим, есть xml-документ следующего вида:

<?xml version="1.0" encoding="UTF-8"?>
<test>
  <div>
    <h1>Основы компьютерной графики</h1>
    <p class="first">Выберите правильные варианты ответов:</p>
  </div>
  <task right="2" timeout="15">
    <todo>Единица выводимой информации при 
			работе дисплея в графическом режиме называется:
		</todo>
    <variant>баррель</variant>
    <variant>байт</variant>
    <variant>пиксель</variant>
    <variant>дюйм</variant>
  </task>
  ...


Требуется «размазать» это содержимое по полям графического интерфейса. Для этого создается парсер

import javafx.data.pull.PullParser;
...
def parser: PullParser = PullParser{
 documentType: PullParser.XML
 input: bind inputStream
 onEvent: function(e){
  if(e.type == PullParser.START_ELEMENT and e.qname.name == "task"){
   insert Question{} into questions;
   varCnt = 0;
   questions[(sizeof questions) - 1].radios[
    Integer.parseInt(e.getAttributeValue("right"))].selected = true;
   questions[(sizeof questions) - 1].spinner.setValue(
    Integer.parseInt(e.getAttributeValue("timeout"))
   )
  }
  if(e.type == PullParser.END_ELEMENT and e.qname.name == "todo"){
   questions[(sizeof questions) - 1].textPane.setText(e.text);
  }
  if(e.type == PullParser.END_ELEMENT and e.qname.name == "variant"){
   questions[(sizeof questions) - 1].answers[varCnt].text = e.text;
   varCnt++;
  }
  if(e.type == PullParser.END_ELEMENT and e.qname.name == "p"){
   descrPane.setText(e.text);
  }
  if(e.type == PullParser.END_ELEMENT and e.qname.name == "h1"){
   titleToBind = e.text;
  }

  if(e.type == PullParser.END_DOCUMENT){inputStream.close()}
 }
};


Затем создается поток из файла и выполняется

parser.parse()


Спасибо Чаку за это разъяснение, без которого я еще не скоро докопался бы до такой эффективной вещи.

Несколько слов о нем

Чак начал программировать на языке Java в 1996 года, сразу после того как он начал работать в компании Sun Microsystems в Гонконге. В настоящий момент он работает в компании Sun в Сингапуре в качестве ведущего консультанта в области распространения технологий. Приоритетными направлениями для Чака являются: Java API, Java EE, Java SE и Java ME. Чак работает с основными независимыми компаниями, занимающимися разработкой ПО азиатско-тихоокеанского региона, в течение последних шести лет помогая им в разработке, создании прототипов, настройке, оценке и тестировании производительности их Java приложений.

Чак — любитель компьютерных игр, он полагает, что платформа Java полезна для создания игр и делится своим энтузиазмом с другими разработчиками. Чак закончил Королевский Технологический Институт в Мельбурне в 1987 году, где его любимым предметом была теория компиляторов.
  • +4
  • 16 апреля 2010, 18:10
  • yababay

Комментарии (0)

RSS свернуть / развернуть

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.