Я вже писав якось про форматування XML. Для форматування використовувалася DOM-модель, XML перетворювався в DOM-документ і форматувався за допомогою бібліотеки Apache Xerces. Сьогодні я використовую код форматування для налагодження. Справа в тому, що я збираюся зайнятися експериментами з XML-е-будовою. Тобто я буду програмно створювати DOM-документ і виводити його у вигляді XML ... Навіщо це потрібно? Здавалося б є безліч чудових засобів для роботи з XML. Однак більшість засобів дозволяють лише парсити XML в якусь заздалегідь сгенерированную модель або виводити готову модель у вигляді XML-файла.
Мені ж потрібно динамічно змінювати XML. Тобто потрібно щоб XML документ динамічно змінювався в процесі виконання програми. Операції, що виконуються над XML-файлом повинні впливати на наступні операції програми ... Для цього я збираюся задіяти XPath API. Але це поки справа майбутнього. Зараз займемося для початку елементарними експериментами. Для початку візьмемо з вищезгаданої статті клас для форматування XML.
Додаю в залежності Maven бібліотеку Apache Xerces, використану для форматування і junit, щоб робити unit-тести.
Додавання елемента в DOM документ
Перші три рядки вищенаведеного тексту створюють новий документ, строчки
створюють кореневої елемент XML-документа з ім'ям root.
Трохи теорії. В DOM-моделі документ складається з вузлів (Nodes) різних типів:
По-крайней технологія XPath підтримує такі типи вузлів, а призначена вона для роботи з DOM-документами. Як видно вище елемент - це звичайний тег XML-документа. Атрибути виглядають так, як у наведеному нижче документі. lang - атрибут зі значенням «xml».
Спробуємо додати нашому документу з першого прикладу атрибут.
Тестую, отримую несподівану помилку:
Виявляється є окрема функція встановлює для елемента атрибут.
Додавання атрибута елементу
Виклик root.setAttribute ( «lang», «en») додає атрибут c ім'ям lang і значенням «en» елементу root:
Додавання дочірнього елемента
Щоб перевірити як Парс документ з CDATA секцією, додаю ще один тест:
Cтрочкой коду нижче перетворю створений XML документ в рядок, потім назад
в DOM-модель і знову в рядок рядок ... і виводжу у вигляді рядка.
String result = XmlUtil.toXML (XmlUtil.fromXML (XmlUtil.toXML (document)));
Секція CDATA розпарсити нормально.