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.