Основы Java XML – учебник для новичка
Это пособие для программистов знакомит с XML и его использованием с Java, статью подготовил Ларс Фогель, переведено нами на русский язык.
XML – это сокращение от Extensible Markup Language и установленный формат обмена данными. XML был определен в 1998 году Консорциумом World Wide Web (W3C).
Для удобства и экономии времени, вы также можете найти онлайн курс на сайте https://jms.university/. XML-документ состоит из элементов, каждый элемент имеет начальный тег, контент и конечный тег. Должен иметь ровно один корневой элемент (т. е. Один тег, который включает остальные теги). Различает заглавные и не заглавные буквы.
Файл XML должен быть правильно сформирован. Это означает, что он должен применяться к следующим условиям:
- XML-документ всегда начинается с пролога
- Каждый открывающий тег имеет закрывающий тег.
- Все теги полностью вложены.
Правильный XML-файл должен содержать ссылку на XML-схему и быть действительным в соответствии с этой схемой. Ниже приведен правильный, корректный XML-файл.
Сравнение XML с другими форматами
Обрабатывать XML-документ относительно легко по сравнению с двоичным или неструктурированным форматом. Это из-за следующих характеристик:
- простой текст
- представляет данные без определения способа отображения данных
- может быть преобразован в другие форматы через XSL
- может быть легко обработан с помощью стандартных анализаторов
- XML-файлы являются иерархическими
Если данные представлены в виде XML, размер этих данных является относительно большим по сравнению с другими форматами. JSON или двоичные форматы часто используются для замены, если важна пропускная способность данных.
Элементы XML
XML-документ всегда начинается с пролога, который описывает XML-файл. Этот пролог может быть минимальным, например . Он также может содержать другую информацию, например, кодировку .
Тег, который не содержит никакого содержимого, называется «пустым тегом», например, .
Комментарии в XML определяются как: .
Обзор XML Java
Язык программирования Java содержит несколько методов для обработки и написания XML.
Более старые версии Java поддерживали только API DOM (объектная модель документа) и API SAX (простой API для XML).
В DOM вы получаете доступ к документу XML через дерево объектов. DOM может использоваться для чтения и записи файлов.
SAX (простой API для XML) – это Java API для последовательного чтения XML-файлов. SAX обеспечивает управляемую событиями обработку XML по модели Push-Parsing. В этой модели вы регистрируете слушателей в виде Handlers to the Parser. Они уведомляются через методы обратного вызова.
И DOM, и Sax – старые API, и я рекомендую больше их не использовать.
Stax (Streaming API for XML) – это API для чтения и записи XML-документов. Он был представлен в Java 6.0 и считается превосходящим SAX и DOM.
Архитектура Java для привязки XML (JAXB) – это стандарт Java, который позволяет преобразовывать объекты Java в XML и наоборот. JAXB определяет API для чтения и записи объектов Java в документы XML. Он также позволяет выбирать реализацию JAXB. JAXB применяет множество настроек по умолчанию, что делает чтение и запись очень простым.
Ниже объясняется интерфейс Stax.
Потоковый API для XML (StaX)
Потоковый API для XML, называемый StaX, представляет собой API для чтения и записи XML-документов.
StaX – это модель Pull-Parsing, может взять на себя управление анализом XML-документов, извлекая (принимая) события из анализатора.
Ядро StaX API делится на две категории, и они перечислены ниже.
Приложения могут использовать любой из этих двух API. Далее речь пойдет об API итератора событий, так как я считаю его более удобным в использовании.
API Event Iterator
API итератора событий имеет два основных интерфейса: XMLEventReader для синтаксического анализа XML и XMLEventWriter для генерации XML.
XMLEventReader – читаем пример XML
Этот пример хранится в проекте “de.vogella.xml.stax.reader”.
Приложения зацикливаются на всем документе. API-интерфейс Event Iterator реализован поверх API-интерфейса Cursor.
В этом примере мы прочитаем следующий XML-документ и создадим из него объекты.
1 900 1 1 2 400 2 5 9 5 100 3
Определим следующий класс для хранения отдельных записей.
package de.vogella.xml.stax.model; public class Item < private String date; private String mode; private String unit; private String current; private String interactive; public String getDate() < return date; >public void setDate(String date) < this.date = date; >public String getMode() < return mode; >public void setMode(String mode) < this.mode = mode; >public String getUnit() < return unit; >public void setUnit(String unit) < this.unit = unit; >public String getCurrent() < return current; >public void setCurrent(String current) < this.current = current; >public String getInteractive() < return interactive; >public void setInteractive(String interactive) < this.interactive = interactive; >@Override public String toString() < return "Item [current=" + current + ", date=" + date + ", interactive=" + interactive + ", mode=" + mode + ", unit=" + unit + "]"; >>
Далее читается файл XML и создается список элементов объекта из записей.
package de.vogella.xml.stax.read; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.InputStream; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import javax.xml.stream.XMLEventReader; import javax.xml.stream.XMLInputFactory; import javax.xml.stream.XMLStreamException; import javax.xml.stream.events.Attribute; import javax.xml.stream.events.EndElement; import javax.xml.stream.events.StartElement; import javax.xml.stream.events.XMLEvent; import de.vogella.xml.stax.model.Item; public class StaXParser < static final String DATE = "date"; static final String ITEM = "item"; static final String MODE = "mode"; static final String UNIT = "unit"; static final String CURRENT = "current"; static final String INTERACTIVE = "interactive"; @SuppressWarnings(< "unchecked", "null" >) public List readConfig(String configFile) < List items = new ArrayList(); try < // First, create a new XMLInputFactory XMLInputFactory inputFactory = XMLInputFactory.newInstance(); // Setup a new eventReader InputStream in = new FileInputStream(configFile); XMLEventReader eventReader = inputFactory.createXMLEventReader(in); // read the XML document Item item = null; while (eventReader.hasNext()) < XMLEvent event = eventReader.nextEvent(); if (event.isStartElement()) < StartElement startElement = event.asStartElement(); // If we have an item element, we create a new item if (startElement.getName().getLocalPart().equals(ITEM)) < item = new Item(); // We read the attributes from this tag and add the date // attribute to our object Iterator attributes = startElement .getAttributes(); while (attributes.hasNext()) < Attribute attribute = attributes.next(); if (attribute.getName().toString().equals(DATE)) < item.setDate(attribute.getValue()); >> > if (event.isStartElement()) < if (event.asStartElement().getName().getLocalPart() .equals(MODE)) < event = eventReader.nextEvent(); item.setMode(event.asCharacters().getData()); continue; >> if (event.asStartElement().getName().getLocalPart() .equals(UNIT)) < event = eventReader.nextEvent(); item.setUnit(event.asCharacters().getData()); continue; >if (event.asStartElement().getName().getLocalPart() .equals(CURRENT)) < event = eventReader.nextEvent(); item.setCurrent(event.asCharacters().getData()); continue; >if (event.asStartElement().getName().getLocalPart() .equals(INTERACTIVE)) < event = eventReader.nextEvent(); item.setInteractive(event.asCharacters().getData()); continue; >> // If we reach the end of an item element, we add it to the list if (event.isEndElement()) < EndElement endElement = event.asEndElement(); if (endElement.getName().getLocalPart().equals(ITEM)) < items.add(item); >> > > catch (FileNotFoundException e) < e.printStackTrace(); >catch (XMLStreamException e) < e.printStackTrace(); >return items; > >
Вы можете проверить парсер с помощью следующей тестовой программы. Обратите внимание, что файл config.xml должен существовать в папке проекта Java.
package de.vogella.xml.stax.read; import java.util.List; import de.vogella.xml.stax.model.Item; public class TestRead < public static void main(String args[]) < StaXParser read = new StaXParser(); List readConfig = read.readConfig("config.xml"); for (Item item : readConfig) < System.out.println(item); >> >
Пример записи файла XML
Этот пример хранится в проекте “de.vogella.xml.stax.writer”.
Предположим, вы хотели бы написать следующий простой XML-файл.
StaX не предоставляет функциональные возможности для автоматического форматирования, поэтому вам необходимо добавить в конец файла строки и информацию табуляции.
package de.vogella.xml.stax.writer; import java.io.FileOutputStream; import javax.xml.stream.XMLEventFactory; import javax.xml.stream.XMLEventWriter; import javax.xml.stream.XMLOutputFactory; import javax.xml.stream.XMLStreamException; import javax.xml.stream.events.Characters; import javax.xml.stream.events.EndElement; import javax.xml.stream.events.StartDocument; import javax.xml.stream.events.StartElement; import javax.xml.stream.events.XMLEvent; public class StaxWriter < private String configFile; public void setFile(String configFile) < this.configFile = configFile; >public void saveConfig() throws Exception < // create an XMLOutputFactory XMLOutputFactory outputFactory = XMLOutputFactory.newInstance(); // create XMLEventWriter XMLEventWriter eventWriter = outputFactory .createXMLEventWriter(new FileOutputStream(configFile)); // create an EventFactory XMLEventFactory eventFactory = XMLEventFactory.newInstance(); XMLEvent end = eventFactory.createDTD("\n"); // create and write Start Tag StartDocument startDocument = eventFactory.createStartDocument(); eventWriter.add(startDocument); // create config open tag StartElement configStartElement = eventFactory.createStartElement("", "", "config"); eventWriter.add(configStartElement); eventWriter.add(end); // Write the different nodes createNode(eventWriter, "mode", "1"); createNode(eventWriter, "unit", "901"); createNode(eventWriter, "current", "0"); createNode(eventWriter, "interactive", "0"); eventWriter.add(eventFactory.createEndElement("", "", "config")); eventWriter.add(end); eventWriter.add(eventFactory.createEndDocument()); eventWriter.close(); >private void createNode(XMLEventWriter eventWriter, String name, String value) throws XMLStreamException < XMLEventFactory eventFactory = XMLEventFactory.newInstance(); XMLEvent end = eventFactory.createDTD("\n"); XMLEvent tab = eventFactory.createDTD("\t"); // create Start node StartElement sElement = eventFactory.createStartElement("", "", name); eventWriter.add(tab); eventWriter.add(sElement); // create Content Characters characters = eventFactory.createCharacters(value); eventWriter.add(characters); // create End node EndElement eElement = eventFactory.createEndElement("", "", name); eventWriter.add(eElement); eventWriter.add(end); >>
package de.vogella.xml.stax.writer; public class TestWrite < public static void main(String[] args) < StaxWriter configFile = new StaxWriter(); configFile.setFile("config2.xml"); try < configFile.saveConfig(); >catch (Exception e) < e.printStackTrace(); >> >
Средняя оценка 2.8 / 5. Количество голосов: 5
Спасибо, помогите другим — напишите комментарий, добавьте информации к статье.
Видим, что вы не нашли ответ на свой вопрос.
Напишите комментарий, что можно добавить к статье, какой информации не хватает.