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

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

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





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





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





  • ПРИГОВОР: Объектная модель документа включает классы для работы с 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, который можно найти здесь :






Gambardella, Matthew
XML Developer's Guide
Computer
44.95
2000-10-01
An in-depth look at creating applications
with XML.


Ralls, Kim
...

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

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

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





черный экран ноутбука toshiba с курсором
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(false);
factory.setValidating(false);
DocumentBuilder builder = factory.newDocumentBuilder();

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

File file = ...; // XML file to read
Document document = builder.parse(file);
Element catalog = document.getDocumentElement();

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





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

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

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

NodeList books = catalog.getChildNodes();
for (int i = 0, ii = 0, n = books.getLength() ; i Node child = books.item(i);
if ( child.getNodeType() != Node.ELEMENT_NODE )
continue;
Element book = (Element)child;
// work with the book Element here
}

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

static private Node findFirstNamedElement(Node parent,String tagName)
{
NodeList children = parent.getChildNodes();
for (int i = 0, in = children.getLength() ; i Node 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(Node parent)
{
StringBuilder text = new StringBuilder();
if ( parent == null )
return text.toString();
NodeList children = parent.getChildNodes();
for (int k = 0, kn = children.getLength() ; k Node 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 Node child = books.item(i);
if ( child.getNodeType() != Node.ELEMENT_NODE )
continue;
Element 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,'genre'));
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
' +
' author: %s
' +
' title: %s
' +
' genre: %s
' +
' price: %s
' +
' pubdate: %s
' +
' descr: %s
',
ii, id, author, title, genre, price, pubdate, descr);
}

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

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

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

id=bk113
author=Jane Austen
title=Pride and Prejudice
genre=Romance
price=6.99
publish_date=2010-04-01
description='It is a truth universally acknowledged, that a single man in possession of a good fortune must be in want of a wife.' So begins Pride and Prejudice, Jane Austen's witty comedy of manners-one of the most popular novels of all time-that features splendidly civilized sparring between the proud Mr. Darcy and the prejudiced Elizabeth Bennet as they play out their spirited courtship in a series of eighteenth-century drawing-room intrigues.

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

File file = ...; // XML file to read
Document document = builder.parse(file);
Element catalog = document.getDocumentElement();

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

String propsFile = ...;
Properties props = new Properties();
try (FileReader in = new FileReader(propsFile)) {
props.load(in);
}

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

String id = props.getProperty('id');
String author = props.getProperty('author');
String title = 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');

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

как установить Mac OS на Windows
Element book = document.createElement('book');
book.setAttribute('id', id);

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

List elnames =Arrays.asList('author', 'title', 'genre', 'price',
'publish_date', 'description');
for (String elname : elnames) {
Element el = document.createElement(elname);
Text text = document.createTextNode(props.getProperty(elname));
el.appendChild(text);
book.appendChild(el);
}
catalog.appendChild(book);

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

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

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

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

tform.transform(new DOMSource(document), new StreamResult(System.out));

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

tform.transform(new DOMSource(document), new StreamResult(new File('output.xml')));

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

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

Делиться Делиться Твитнуть Эл. адрес Canon против Nikon: какой бренд камеры лучше?

Canon и Nikon - два крупнейших имени в индустрии фотоаппаратов. Но какой бренд предлагает лучшую линейку камер и объективов?

Читать далее
Похожие темы
  • Программирование
  • Джава
Об авторе Джей Шридхар(Опубликовано 17 статей) Ещё от Jay Sridhar

Подписывайтесь на нашу новостную рассылку

Подпишитесь на нашу рассылку, чтобы получать технические советы, обзоры, бесплатные электронные книги и эксклюзивные предложения!

Нажмите здесь, чтобы подписаться