Реалізація XML парсера на основі Скінченних Цифрових Автоматів.
Дано потік(InputStream
) тексту в форматі XML.
Необхідно прочитати, розібрати на елементи
і делегувати обробку подій клієнським класам(EventHandler
).
Парсер повинен працювати за час O(N). Обробляти потоково. Об'єм вхідних даних може перевищувати кількість доступної пам'яті.
Створюємо парсер
Parser parser = XmlFactory.newBuilder()
.on(START_ELEMENT, startHandler)
.on(ATTRIBUTE_NAME, handler)
.on(ATTRIBUTE_VALUE, handler)
.on(VALUE, handler)
.on(END_ELEMENT, handler)
.on(ERROR, handler)
.build();
При читанні XML, парсер повинен викликати startHandler
і передавати йому ім'я елемента,
коли відкриваючий тег зустрінеться в тексті.
Аналогічно, ми можемо підписатися на інші події.
Щоб обробити, наприклад, відкриваючий тег, треба реалізувати інтерфейс EventHandler
.
public interface EventHandler {
void handle(String value);
}
Далі ми передаємо текст нашому парсеру
parser.parse(toInputStream("<a class=\"btn\"></a>"));
І очікуємо, що наш обробник, відкритих тегів, викличеться 1 раз з аргументом "a".
Бажано розробку вести за методологією TDD.
Перші тести вже написані в ua.codegym.ParserTest
, але можуть бути розширені.
Успіхів!