Автор оригинала: Vasyl Lagutin.
Что такое XML?
Аббревиатура “XML” расшифровывается как – e X tensible M arkup L ангаж. Он имеет структуру разметки, аналогичную HTML, и был разработан для хранения и транспортировки данных. Он определяет набор правил, которые делают его как человеком, так и машиночитаемым.
Несмотря на то, что это язык разметки, такой как HTML, XML обычно используется для обмена данными между веб-службами, серверной частью и интерфейсами, так же, как JSON , и считается его предшественником.
Если вам интересно прочитать о чтении и написании JSON на Java , мы уже обсудили это!
Важно отметить, что XML не имеет предопределенного набора тегов, таких как HTML, а скорее определяется пользователем. Именно эта гибкость привела к созданию нескольких форматов документов, таких как RSS , Atom , SOAP и XHTML . Все эти форматы, по сути, являются подмножествами XML.
Давайте рассмотрим простой XML-документ, который копирует тот же объект, который мы использовали ранее в отношении JSON:
31 Football Swimming true 5 Billy 3 Milly Benjamin Watson
Ключевое различие между XML и JSON заключается в том, что мы определяем этот файл с версией XML и кодировкой в начале документа с помощью тега . Еще одно отличие состоит в том, что каждое свойство объекта должно быть заключено в свой собственный тег – <возраст>31 . Элементы массива нельзя указать без тега, поэтому для их перечисления мы завершаем их с помощью <элемент>... в теге <хобби>... .
ДЖАКСБ
Поскольку XML-это текстовый формат, вы можете использовать для его чтения и записи те же методы, что и для любого другого текстового файла.
Java, однако, предоставляет удобный способ манипулирования XML с использованием структуры, называемой J ava A архитектура для X ML B inding, или JAXB для краткости. Это позволяет нам сопоставлять объекты Java с XML-документами и наоборот. JAXB был впервые представлен в JDK 1.6 и недоступен в предыдущих версиях.
Поскольку JAXB является стандартной платформой JDK, нет необходимости включать какие-либо внешние зависимости в проект для JDK 1.6+.
Примечание: Однако, если вы используете Java 9 или выше, вам следует включить дополнительный параметр в команду javac . Если вы используете среду разработки, такую как IntelliJ IDEA или Eclipse, найдите дополнительные параметры компилятора и убедитесь, что в нее включена строка --add-modules java.xml.bind .
В случае IntelliJ IDEA он находится в Предпочтения -> Сборка, выполнение, Развертывание -> Компилятор – > Компилятор Java меню.
Если вы все еще будете получать ошибки, такие как Исключение в потоке "основной" 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 называются Маршалинг и Немаршалинг . Неудивительно, что они представлены классами Маршаллер и Немаршаллер .
Сортировка-это процесс преобразования объектов Java в XML, а разбиение-это процесс преобразования XML в объекты Java.
JAXB настраивается с использованием аннотаций, импортированных из пакета javax.xml.bind.annotations .
Давайте определим класс Java, который представляет человека, описанного в нашем XML-документе:
@XmlRootElement
public class Person {
public Person(String name, int age, boolean isMarried, List hobbies, 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{" +
"name='" + name + '\'' +
", age=" + age +
", isMarried=" + isMarried +
", hobbies=" + hobbies +
", kids=" + kids +
'}';
}
}
@XmlRootElement – сопоставляет класс или тип перечисления с элементом XML. Он описывает корневой элемент XML-документа и должен быть указан в объявлении Person class.
@XmlElementWrapper – создает элемент оболочки вокруг представления XML, в нашем случае Список . Элементы списка должны быть указаны явно с помощью аннотации @XmlElement .
@XmlElement – сопоставляет свойство из объекта Java с элементом XML, производным от имени свойства. Чтобы указать другое имя свойства XML, мы включаем его в качестве строкового параметра в объявление аннотации, т. е. (имя) .
Без промедления
Самый простой пример метода сортировки потребует от нас создания экземпляра JAXBContext , передающего Person.class в качестве единственного входного параметра его конструктора.
Затем unmarshaller создается путем вызова метода createUnmarshaller () , и экземпляр фактического Человека создается его unmarshal() методом.
Обязательно используйте явную типизацию, так как unmarshal метод возвращает объект типа:
Git Essentials
Ознакомьтесь с этим практическим руководством по изучению Git, содержащим лучшие практики и принятые в отрасли стандарты. Прекратите гуглить команды Git и на самом деле изучите это!
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);
}
}
После запуска этого кода вы должны увидеть что-то вроде:
Person{name='Benjamin Watson', age=31, isMarried=true, hobbies=[Football, Swimming], kids=[Person{name='Billy', age=5, isMarried=null, hobbies=null, kids=null}, Person{name='Milly', age=3, isMarried=null, hobbies=null, kids=null}]}
Сортировка
Чтобы продемонстрировать способность JAXB писать XML-файл, используя объект Java в качестве источника, мы добавим следующий метод:
private static void personToXMLExample(String filename, Person person) throws Exception {
File file = new File(filename);
JAXBContext jaxbContext = JAXBContext.newInstance(Person.class);
Marshaller jaxbMarshaller = jaxbContext.createMarshaller();
jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
jaxbMarshaller.marshal(person, file);
jaxbMarshaller.marshal(person, System.out);
}
Это очень похоже на предыдущий пример и включает в себя повторное создание 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 в класс-оболочку Boolean и возвращаемый тип геттера isMarried() в примитивный логический , что приводит к тому, что JAXB пытается распаковать null и в результате выдает Исключение NullPointerException .
Быстрое и простое решение этой проблемы состояло бы в том, чтобы выровнять эти два значения либо логическое , либо Логическое .
После устранения проблемы мы получим следующие выходные данные как для консоли, так и для файла:
31 Football Swimming 5 Billy 3 Milly true Benjamin Watson
Как мы видим, он полностью идентичен исходному XML-файлу, который мы собрали в объект person .
Вывод
Чтение и запись XML на Java можно легко выполнить с помощью платформы JAXB. Используя аннотации, мы определяем правила сопоставления между классами Java и XML-документами, представляющими их объекты.
XML часто считается устаревшим форматом, который уступает JSON. Однако знание того, как читать и писать его с помощью Java, является полезным навыком для любого разработчика программного обеспечения, поскольку многие службы в Интернете все еще используют его и еще не имеют API JSON. Это также относится ко многим форматам файлов, которые хранят данные в файлах в формате XML.
Хотя, если вам больше нравится JSON, я бы посоветовал почитать о чтении и записи JSON на Java, мы тоже об этом позаботились!