Xml хранение данных java

Rukovodstvo

статьи и идеи для разработчиков программного обеспечения и веб-разработчиков.

Чтение и запись XML в Java

Что такое XML? Аббревиатура «XML» означает — расширяемый язык разметки. Он имеет структуру разметки, аналогичную HTML, и был разработан для хранения и передачи данных. Он определяет набор правил, которые делают его читаемым как человеком, так и машиной. Несмотря на то, что XML является языком разметки, таким как HTML, он обычно используется для обмена данными между веб-службами, серверными приложениями и интерфейсами, как JSON, и считается его предшественником. Если вам интересно читать о чтении и записи JSON на Java [/ r

Что такое XML?

Аббревиатура «XML» означает — е X tensible M arkup L anguage. Он имеет структуру разметки, аналогичную HTML, и был разработан для хранения и передачи данных. Он определяет набор правил, которые делают его читаемым как человеком, так и машиной.

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

Если вам интересно читать о чтении и записи JSON на Java , мы уже рассмотрели это!

Важно отметить, что XML не имеет предопределенного набора тегов, таких как HTML, а скорее определяется пользователем. Именно эта гибкость привела к созданию множества форматов документов, таких как RSS , Atom , SOAP и XHTML . По сути, все эти форматы являются подмножествами XML.

Читайте также:  HTML заголовки

Давайте посмотрим на простой XML-документ, который реплицирует тот же объект, который мы использовали ранее в отношении JSON:

   31 Football Swimming  true  5 Billy  3 Milly   Benjamin Watson  

Ключевое различие между XML и JSON заключается в том, что мы определяем этот файл с версией XML и кодируем в начале документа с помощью . Еще одно отличие состоит в том, что каждое свойство объекта должно быть заключено в отдельный тег — 31 . Элементы массива не могут быть указаны без тега, поэтому, чтобы перечислить их, мы помещаем их в . внутри . .

JAXB

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

Java, однако, обеспечивает удобный способ манипулирования XML с использованием структуры под названием J AVA rchitecture для X ML B inding или JAXB для краткости. Это позволяет нам отображать объект Java в документы XML и наоборот. JAXB был впервые представлен в JDK 1.6 и недоступен в предыдущих версиях.

Поскольку JAXB является стандартной структурой JDK, нет необходимости включать в проект какие-либо внешние зависимости для JDK 1.6+.

Примечание. Если вы используете Java 9 или выше, вам следует включить в команду javac дополнительный параметр. Если вы используете IDE, например IntelliJ IDEA или Eclipse, поищите дополнительную настройку параметров компилятора и убедитесь, что она включает —add-modules java.xml.bind .

В случае IntelliJ IDEA он находится в Preferences -> Build, Execution, Deployment -> Compiler -> Java Compiler .

Если вы все равно будете получать такие ошибки, как Exception in thread «main» java.lang.NoClassDefFoundError: javax/xml/bind/JAXBContext даже после добавления дополнительной опции компилятора, добавьте следующие зависимости Maven:

  javax.xml.bind jaxb-api 2.2.11  com.sun.xml.bind jaxb-core 2.2.11  com.sun.xml.bind jaxb-impl 2.2.11  javax.activation activation 1.1.1  

Концепции ядра JAXB называются сортировочные и демаршалинг . Неудивительно, что они представлены классами Marshaller и Unmarshaller .

Маршаллинг — это процесс преобразования объектов Java в XML, а демаршаллинг — это процесс преобразования XML в объекты Java.

Читайте также:  Import apache commons io java

JAXB настраивается с использованием аннотаций, которые импортируются из пакета javax.xml.bind.annotations

Давайте определим класс Java, который представляет человека, описанного в нашем XML-документе:

 @XmlRootElement public class Person < public Person(String name, int age, boolean isMarried, Listhobbies, List kids) < this.name = name; this.age = age; this.isMarried = isMarried; this.hobbies = hobbies; this.kids = kids; >public Person(String name, int age) < this(name, age, false, null, null); >private String name; private Integer age; private Boolean isMarried; private List hobbies; private List kids; public String getName() < return name; >public void setName(String name) < this.name = name; >public int getAge() < return age; >public void setAge(int age) < this.age = age; >public boolean isMarried() < return isMarried; >@XmlElement(name = "isMarried") public void setMarried(boolean married) < isMarried = married; >@XmlElementWrapper(name = "hobbies") @XmlElement(name = "element") public List getHobbies() < return hobbies; >public void setHobbies(List hobbies) < this.hobbies = hobbies; >public List getKids() < return kids; >@XmlElementWrapper(name = "kids") @XmlElement(name = "person") public void setKids(List kids) < this.kids = kids; >@Override public String toString() < return "Person'; > > 

@XmlRootElement — сопоставляет класс или тип перечисления с элементом XML. Он описывает корневой элемент XML-документа и должен быть указан в объявлении класса Person

@XmlElementWrapper — генерирует элемент-оболочку вокруг XML-представления, в нашем случае List Элементы списка следует указывать явно с @XMLElement аннотации @XMLElement.

@XMLElement — сопоставляет свойство объекта Java с элементом XML, производным от имени свойства. Чтобы указать другое имя свойства XML, мы включаем его как параметр String в объявление аннотации, то есть (name = «person») .

Демаршаллинг

Простейший пример техники маршалинга потребует от нас создать JAXBContext , передав Person.class в качестве единственного входного параметра его конструктора.

Затем создается createUnmarshaller() , а экземпляр фактического Person создается его методом unmarshal() .

Обязательно используйте явное приведение типов, так как unmarshal метод возвращает тип Object:

 public class Solution < public static void main(String[] args) throws Exception < Person person = XMLtoPersonExample("person.xml"); System.out.println(person); >private static Person XMLtoPersonExample(String filename) throws Exception < File file = new File(filename); JAXBContext jaxbContext = JAXBContext.newInstance(Person.class); Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller(); return (Person) jaxbUnmarshaller.unmarshal(file); >> 

После запуска этого кода вы должны увидеть что-то вроде:

Читайте также:  Блочная вёрстка

Маршаллинг

Чтобы продемонстрировать способность JAXB записывать XML-файл с использованием объекта Java в качестве источника, мы добавим следующий метод:

 private static void personToXMLExample(String filename, Person person) throws Exception

Он очень похож на предыдущий пример и включает повторное JAXBContext Однако на этот раз процесс пойдет в обратном направлении, и вывод XML будет записан в файл и консоль.

Добавив вызов этого метода в качестве последней строки в Solution.main() например:

 personToXMLExample("person-output.xml", person); 

и запустив его, мы получим досадное исключение.

 Exception in thread "main" java.lang.NullPointerException at com.stackabuse.xml.Person.isMarried(Person.java:49) at com.stackabuse.xml.Person$JaxbAccessorM_isMarried_setMarried_boolean.get(MethodAccessor_Boolean.java:61) . 

Мы допустили ошибку, установив isMarried поля isMarried в класс-оболочку Boolean а тип возвращаемого значения getter isMarried() в примитивное boolean , что приводит к тому, что JAXB пытается распаковать null и в результате выбрасывает NullPointerException .

Быстрое и простое решение этой проблемы — выровнять эти два значения либо с boolean Boolean .

После устранения проблемы мы получим следующий вывод как в консоль, так и в файл:

   31 Football Swimming   5 Billy  3 Milly   true Benjamin Watson  

Как мы видим, он полностью идентичен исходному XML-файлу, который мы упорядочили в объект person

Заключение

Чтение и запись XML на Java можно легко выполнить с помощью инфраструктуры JAXB. Используя аннотации, мы определяем правила отображения между Java-классами и XML-документами, которые представляют их объекты.

XML часто считается устаревшим форматом, который уступает JSON. Однако знание того, как его читать и писать с помощью Java, является полезным навыком для любого разработчика программного обеспечения, поскольку многие службы в Интернете все еще используют его и еще не имеют JSON API. Это также относится ко многим форматам файлов, в которых данные хранятся в файлах в формате XML.

Хотя, если вам больше нравится JSON, я бы посоветовал прочитать о чтении и записи JSON на Java, мы это тоже рассмотрели!

Licensed under CC BY-NC-SA 4.0

Источник

Оцените статью