24 марта 2021
Как известно, формат xml нечувствителен к отступам и пробелам между тэгами. Поэтому с целью уменьшения объема данных и без того многословный xml можно записать в одну строку. Тогда вы получите заметное уменьшение объёма, но при этом такой формат будет сложно просматривать.
Чтобы сделать его удобочитаемым, мы можем написать специальный метод, который будет считывать исходный xml, форматировать его по определённым правилам и возвращать новый xml в виде строки. Форматирование будем производить без сторонних библиотек стандартными средствами JDK.
Рассмотрим следующий пример на kotlin:
Наш метод xmlPrettyPrint() принимает два параметра: исходный неформатированный xml и количество пробелов, которые требуются для одного отступа (вместо символа табуляции).
В начале создаём новый DocumentBuilder с помощью класса javax.xml.parsers.DocumentBuilderFactory. Затем в блоке try пытаемся прочитать исходный xml. Обратите внимание, что строка с xml не должна быть пустой. Она должна содержать валидный xml.
Тут мы перехватываем некоторые исключения, которые могут возникнуть при парсинге xml. Например, SAXParseException.
Далее создаём трансформер с помощью javax.xml.transform.TransformerFactory и настраиваем его нужным образом:
Все свойства устанавливаются с помощью метода setOutputProperty():
Теперь нам осталось применить эти правила и получить новую строку с отформатированным xml:
Здесь используем метод transform(), в который передаём исходный объект документа, оборачивая его в класс javax.xml.transform.dom.DOMSource и новый объект StringWriter, обёрнутый в javax.xml.transform.stream.StreamResult. Возвращаем результат работы нашего метода, полученный в stringWriter.
Теперь мы готовы протестировать логику работы нашего метода. Передадим в него такую строку:
Метод вернёт такой результат:
Как видите, элементы списка были отформатированы с учётом вложенности, сделав исходный xml более читаемым.
Kotlin, Java, Spring, Spring Boot, Spring Data, SQL, PostgreSQL, Oracle, Linux, Hibernate, Collections, Stream API, многопоточность, файлы, Nginx, Apache, maven, gradle, JUnit, YouTube, новости, руководство, ООП, алгоритмы, головоломки, rest, GraphQL, Excel, XML, json, yaml.