Перейти к основному содержимому

Записать org.w3.dom.Document в файл

· 3 мин. чтения

1. Обзор

Важной частью обработки XML является создание файлов XML, которые могут использоваться другими.

При обработке XML в Java у нас часто будет экземпляр org.w3c.dom.Document , который нам нужно экспортировать.

В этом кратком руководстве мы увидим, как записать документ в файл как в встроенном, так и в печатном формате .

2. Использование трансформатора

Тяжеловесом при записи Documents в файлы является javax.xml.transform.Transformer.

2.1. Создание Трансформера

Итак, начнем с получения TransformerFactory . Мы будем использовать эту фабрику для создания трансформатора:

TransformerFactory transformerFactory = TransformerFactory.newInstance()

Системное свойство javax.xml.transform.TransformerFactory указывает, какую реализацию фабрики необходимо создать. Следовательно, это свойство называет конкретный подкласс абстрактного класса TransformerFactory . Но если мы не определим это свойство, преобразователь просто будет использовать платформу по умолчанию.

Обратите внимание, что начиная с Java 9 мы можем использовать TransformerFactory. newDefaultInstance( ) для создания встроенной реализации системы по умолчанию.

Теперь, когда у нас есть фабрика, давайте создадим трансформатор :

Transformer transformer = transformerFactory.newTransformer();

2.2. Указание источника и результата

Преобразователь преобразует источник в результат. В нашем случае источником является XML-документ, а результатом является выходной файл.

Во-первых, давайте укажем источник преобразования. Здесь мы будем использовать наш документ для создания источника DOM:

DOMSource source = new DOMSource(document);

Обратите внимание, что источником может быть не весь документ. Пока XML правильно сформирован, мы можем использовать поддерево документа.

Далее мы укажем, куда преобразователь должен записать результат преобразования:

FileWriter writer = new FileWriter(new File(fileName));
StreamResult result = new StreamResult(writer);

Здесь мы сообщаем преобразователю, что результатом является файловый поток. Но мы можем использовать любой тип java.io.Writer или java.io.OutputStream для создания StreamResult. Например, мы могли бы использовать StringWriter для создания строки , которая затем может быть зарегистрирована.

2.3. Создание XML-файла

Наконец, мы скажем преобразователю работать с исходным объектом и выводить в результирующий объект:

transformer.transform(source, result);

Это, наконец, создаст файл с содержимым XML-документа:

<?xml version="1.0" encoding="UTF-8" standalone="no"?><Company><Department name="Sales">
<Employee name="John Smith"/><Employee name="Tim Dellor"/></Department></Company>

3. Настройка вывода

Мы можем настроить XML, записанный в файл, указав различные свойства вывода . Давайте рассмотрим некоторые из них.

3.1. Красивая печать вывода

Теперь наш преобразователь по умолчанию просто записал все в одну строку, что не так приятно читать. Действительно, было бы еще труднее читать, если бы XML был большим.

Мы можем настроить наш преобразователь для красивой печати, установив свойство OutputKeys.INDENT в преобразователе:

transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4");

Обратите внимание, что наряду с OutputKeys.INDENT мы также указали здесь свойство indent-amount . Это приведет к правильному отступу вывода, так как по умолчанию отступ равен нулю пробелов.

С установленными выше свойствами мы получаем гораздо более приятный результат:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<Company>
<Department name="Sales">
<Employee name="John Smith"/>
<Employee name="Tim Dellor"/>
</Department>
</Company>

3.2. Пропуск XML-декларации

Иногда мы можем захотеть исключить XML-декларацию.

Мы можем настроить наш преобразователь для этого, установив свойство OutputKeys.OMIT_XML_DECLARATION :

transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");

И снова используя наш преобразователь, мы получаем:

<Company>
<Department name="Sales">
<Employee name="John Smith"/>
<Employee name="Tim Dellor"/>
</Department>
</Company>

3.3. Другие выходные свойства

Таким образом, помимо красивой печати и пропуска объявления XML, мы можем настроить вывод и другими способами:

  • Мы можем указать версию XML, используя OutputKeys.VERSION, по умолчанию «1.0» .
  • Мы можем указать нашу предпочтительную кодировку символов, используя OutputKeys.ENCODING , по умолчанию «utf-8» .
  • И мы также можем указать другие типичные атрибуты объявления, такие как SYSTEM , PUBLIC и STANDALONE .

4. Вывод

В этом руководстве мы увидели, как экспортировать org.w3c.Document в файл и как настроить вывод.

И, конечно же, исходный код доступен на GitHub .