Как читать и писать файлы XML с помощью кода

Хотите узнать, как читать и записывать XML-файл из java?

Файлы XML используются для множества целей, включая хранение данных. До того, как JSON стал популярным, XML был предпочтительным форматом для представления, хранения и транспортировки структурированных данных. Несмотря на то, что популярность XML в последние годы пошла на убыль, вы можете иногда сталкиваться с ним, поэтому важно научиться работать с ним из кода.

Java Standard Edition (SE) включает Java API для обработки XML (JAXP) , который является общим термином, охватывающим большинство аспектов обработки XML. К ним относятся:

  • DOM: объектная модель документа включает классы для работы с артефактами XML, такими как элемент, узел, атрибуты и т. Д. DOM API загружает полный XML-документ в память для обработки, поэтому он не очень подходит для работы с большими XML-файлами.
  • SAX: Простой API для XML — это управляемый событиями алгоритм чтения XML. Здесь XML обрабатывается путем срабатывания событий, обнаруженных при чтении XML. Требования к памяти для использования этого метода невысоки, но работать с API сложнее, чем с DOM.
  • StAX: Streaming API для XML является недавним дополнением к XML API и обеспечивает высокопроизводительную фильтрацию, обработку и модификацию потоков XML. Хотя он позволяет избежать загрузки всего XML-документа в память, он обеспечивает архитектуру вытягивающего типа, а не архитектуру, управляемую событиями, поэтому приложение легче кодировать и понимать, чем использование SAX API.

В этой статье мы используем DOM API для продемонстрировать, как читать и записывать файлы XML из java. Мы рассмотрим два других API в следующих статьях.

Образец XML-файла

В этой статье мы демонстрируем концепции используя следующий образец XML, который можно найти здесь:

   xml version = "1.0"?> 


Гамбарделла, Мэтью
Руководство разработчика XML
Компьютер
44.95
01.10.2000
Подробный обзор создания приложений
с XML.


Раллс, Ким
...

Чтение файла XML

Давайте посмотрим на основные шаги, необходимые для чтения XML-файла с помощью DOM API.

Первый шаг — получить экземпляр DocumentBuilder . Конструктор используется для анализа XML-документов. Для базового использования мы делаем это так:

  DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance (); 
factory.setNamespaceAware (false);
factory.setValidating (false);
DocumentBuilder builder = factory.newDocumentBuilder ();

Теперь мы можем загрузить весь документ в память, начиная с корневой элемент XML. В нашем примере это элемент catalog .

  Файл file = ...; //XML-файл для чтения 
Document document = builder.parse (file);
Element catalog = document.getDocumentElement ();

Вот и все, ребята! DOM API для чтения XML действительно прост. Теперь у вас есть доступ ко всему XML-документу, начиная с его корневого элемента, каталога . Давайте теперь посмотрим, как с этим работать.

Использование DOM API

Сейчас что у нас есть корневой элемент XML Element , мы можем использовать DOM API для извлечения интересных фрагментов информации.

Получить все дочерние элементы book корневого элемента и перебрать их. Обратите внимание, что getChildNodes () возвращает всех дочерних элементов, включая текст, комментарии и т. Д. Для нашей цели нам нужны только дочерние элементы, поэтому мы пропускаем другие.

  NodeList books = catalog.getChildNodes (); 
for (int i = 0, ii = 0, n = books.getLength (); i Узел child = books.item (i);
if (child.getNodeType ()! = Node.ELEMENT_NODE) ​​
continue;
Элемент book = (Element) child;
//здесь работаем с книгой Element
}

Как найти конкретный дочерний элемент, учитывая родительский? Следующий статический метод возвращает первый совпадающий элемент, если он найден, или значение null. Как видите, процедура включает в себя получение списка дочерних узлов и их цикл, выбирая узлы элементов с указанным именем.

  статический частный узел findFirstNamedElement (родительский узел, String tagName) 
{
NodeList children = parent.getChildNodes ();
for (int i = 0, in = children.getLength (); i Узел child = children.item (i);
if (child.getNodeType ()! = Node.ELEMENT_NODE) ​​
continue;
if (child.getNodeName (). equals (tagName))
return child;
}
return null;
}

Обратите внимание, что DOM API обрабатывает текстовое содержимое внутри элемента как отдельный узел типа TEXT_NODE . Кроме того, текстовое содержимое может быть разделено на несколько смежных текстовых узлов. Таким образом, для получения текстового содержимого внутри элемента требуется следующая специальная обработка.

  static private String getCharacterData (родительский узел) 
{
StringBuilder text = new StringBuilder ();
if (parent = = null)
return text.toString ();
NodeList children = parent.getChildNodes ();
for (int k = 0, kn = children.getLength (); k Узел child = children.item (k);
if (child.getNodeType ()! = Node.TEXT_NODE) ​​
break;
text.append (child.getNodeValue ());
}
return text.toString ();
}

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

  NodeList books = catalog.getChildNodes (); 
for (int i = 0, ii = 0, n = books.getLength (); i Детский узел = books.item (i);
if (child.getNodeType ()! = Node.ELEMENT_NODE) ​​
continue;
Элемент book = (Element) child;
ii ++;
String id = book.getAttribute ("id");
String author = getCharacterData (findFirstNamedElement (child, "author"));
String title = getCharacterData (findFirstNamedElement (child, "title"));
String genre = getCharacterData (findFirstNamedElement (child, "жанр"));
String price = getCharacterData (findFirstNamedElement (child, "price"));
String pubdate = getCharacterData (findFirstNamedElement (child, "pubdate"));
String descr = getCharacterData (findFirstNamedElement (child, "description"));
System.out.printf ("% 3d. book id =% s
" +
"автор:% s
" +
"title:% s
" +
"жанр:% s
" +
"цена:% s
"+
" pubdate:% s
"+
" descr:% s
",
ii, id, автор, заголовок , жанр, цена, дата публикации, описание);
}

Написание вывода XML

Java предоставляет XML Tranform API для преобразования данных XML. Мы используем этот API с преобразованием идентичности для генерации вывода.

В качестве примера давайте добавим новый элемент book в образец каталога, представленного выше.. Подробная информация о книге (например, автор , название и т. Д.) Может быть получена извне, возможно, из файла свойств или базы данных. Мы используем следующий файл свойств для загрузки данных.

  id = bk113 
author = Джейн Остин
title = Гордость и предубеждение
genre = Romance
цена = 6.99
publish_date = 2010-04-01
description = "Это общепризнанная истина, что одинокий мужчина, обладающий хорошим состоянием, должен нуждаться в жене". Так начинается остроумная комедия Джейн Остин о манерах «Гордость и предубеждение» - один из самых популярных романов всех времен, - в котором рассказывается о великолепно цивилизованных спорах между гордым мистером Дарси и предубежденной Элизабет Беннет, когда они разыгрывают свои пылкие ухаживания в серии романов. Интриги в гостиной восемнадцатого века.

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

  Файл file = ...; //XML-файл для чтения 
Document document = builder.parse (file);
Element catalog = document.getDocumentElement ();

Мы загружаем данные из файла свойств с помощью класса Properties , поставляемого с java. Код довольно простой и показан ниже.

  String propsFile = ...; 
Свойства props = new Properties ();
try (FileReader in = new FileReader (propsFile)) {
props.load (in);
}

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

  String id = props.getProperty ("id"); 
String author = props.getProperty ("author");
Заголовок строки = props.getProperty ("title");
String genre = props.getProperty ("genre");
String price = props.getProperty ("price");
String publish_date = props.getProperty ("publish_date");
String descr = props.getProperty ("description");

Давайте теперь создадим пустой элемент book .

  Элемент book = document.createElement ("book"); 
book.setAttribute ("id", id);

Добавление дочерних элементов в книгу тривиально. Для удобства мы собираем необходимые имена элементов в List и добавляем значения в цикл.

  Список  elnames = Arrays.asList ("автор", "название", "жанр", "цена", 
"дата_публикации", " description ");
for (String elname: elnames) {
Element el = document.createElement (elname);
Text text = document.createTextNode (props.getProperty (elname) );
el.appendChild (текст);
book.appendChild (el);
}
catalog.appendChild (книга);

И вот как это делается. В элемент catalog теперь добавлен новый элемент book . Теперь остается только выписать обновленный XML.

Для написания XML нам понадобится экземпляр Transformer , который создается, как показано ниже. Обратите внимание, что мы запрашиваем отступ в выходном XML с помощью метода setOutputProperty () .

  TransformerFactory tfact = TransformerFactory.newInstance (); 
Transformer tform = tfact .newTransformer ();
tform.setOutputProperty (OutputKeys.INDENT, "да");
tform.setOutputProperty ("{http://xml.apache.org/xslt}indent-amount" , "3");

Последним шагом в создании вывода XML является применение преобразования. Результат появится в выходном потоке System.out .

  tform.transform (новый DOMSource (документ), новый StreamResult (System.out)); 

Чтобы записать вывод непосредственно в файл, используйте следующее.

  tform.transform (новый DOMSource (документ), новый StreamResult (новый файл ("output.xml"))); 

На этом мы завершаем статью о чтении и записи XML-файлов с помощью DOM API.

Использовали ли вы DOM API в своих приложениях? Как это работало? Пожалуйста, дайте нам знать в комментариях ниже.

Оцените статью
cuterful.ru
Добавить комментарий