Gymterview
middle

Какие вы знаете способы записи XML?

Существуют два основных способа записи XML-документов в Java: прямая (потоковая) запись и запись через DOM-дерево. Выбор зависит от того, нужно ли формировать структуру документа заранее или можно писать последовательно.

Прямая (потоковая) запись

Документ формируется тег за тегом, атрибут за атрибутом, без создания промежуточного представления в памяти. В Java это реализуется через XMLStreamWriter (StAX API).

  • Высокая скорость работы
  • Минимальный расход памяти — нет промежуточных объектов
  • Пригоден только для записи — нельзя вернуться и изменить уже записанный элемент
  • Программист отвечает за правильную вложенность тегов
Пример
XMLOutputFactory factory = XMLOutputFactory.newInstance();
XMLStreamWriter writer = factory.createXMLStreamWriter(
    new FileOutputStream("output.xml"), "UTF-8");

writer.writeStartDocument("UTF-8", "1.0");
writer.writeStartElement("catalog");
writer.writeStartElement("book");
writer.writeAttribute("id", "1");
writer.writeStartElement("title");
writer.writeCharacters("Effective Java");
writer.writeEndElement(); // title
writer.writeEndElement(); // book
writer.writeEndElement(); // catalog
writer.writeEndDocument();
writer.close();

Запись через DOM

Сначала формируется полное дерево документа в памяти (Document), затем оно сериализуется в файл через Transformer.

  • Пригоден как для чтения, так и для записи — можно модифицировать существующий документ
  • Можно произвольно добавлять/удалять узлы до записи
  • Повышенный расход памяти — все дерево хранится в куче
  • Более низкая скорость из-за создания объектов

Сравнение

Критерий Прямая запись (StAX) Запись через DOM
Память Минимальная Весь документ в памяти
Скорость Высокая Ниже
Модификация Нет (только вперед) Да (произвольная)
Чтение + запись Нет Да
Сложность Низкая Умеренная

На собеседовании: интервьюер хочет услышать, что прямая запись — это StAX (XMLStreamWriter), а DOM-запись — через Transformer. Частая ошибка — забыть про прямую запись и назвать только DOM, или не упомянуть конкретные Java API.