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 .