Примечание. Ознакомьтесь с нашим учебником по JAXB для привязки Java XML — руководство по ULTIMATE
Что такое JAXB?
JAXB обозначает архитектуру Java для привязки XML. Он используется для преобразования XML в объект java и объект java в XML. JAXB определяет API для чтения и записи объектов Java в и из документов XML. В отличие от SAX и DOM, нам не нужно знать о методах парсинга XML.
Есть две операции, которые вы можете выполнить с помощью JAXB
- Marshalling : преобразование Java-объекта в XML
- UnMarshalling : преобразование XML в Java-объект
JAXB Учебник
Мы создадим Java-программу для маршала и демаршала.
Для Marshalling:
Для демаршаллинга:
Java программа:
С помощью аннотаций и API, предоставляемых JAXB, преобразование Java-объекта в XML и наоборот становится очень простым.
1.Country.java
Объект Java, который будет использоваться для преобразования в и из XML
Создайте Country.java в src-> org.arpit.javapostsforlearning.jaxb
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
|
package org.arpit.javapostsforlearning.jaxb;import java.util.ArrayList;import javax.xml.bind.annotation.XmlElement;import javax.xml.bind.annotation.XmlElementWrapper;import javax.xml.bind.annotation.XmlRootElement;import javax.xml.bind.annotation.XmlType;//Below annotation defines root element of XML file@XmlRootElement//You can define order in which elements will be created in XML file//Optional@XmlType(propOrder = { 'countryName', 'countryPopulation', 'listOfStates'})public class Country { private String countryName; private double countryPopulation; private ArrayList<state> listOfStates; public Country() { } public String getCountryName() { return countryName; } @XmlElement public void setCountryName(String countryName) { this.countryName = countryName; } public double getCountryPopulation() { return countryPopulation; } @XmlElement public void setCountryPopulation(double countryPopulation) { this.countryPopulation = countryPopulation; } public ArrayList<state> getListOfStates() { return listOfStates; } // XmLElementWrapper generates a wrapper element around XML representation @XmlElementWrapper(name = 'stateList') // XmlElement sets the name of the entities in collection @XmlElement(name = 'state') public void setListOfStates(ArrayList<state> listOfStates) { this.listOfStates = listOfStates; }} |
@XmlRootElement: эта аннотация определяет корневой элемент файла XML.
@XmlType (propOrder = {‘список атрибутов в порядке’}) : используется для определения порядка элементов в файле XML. Это необязательно.
@XmlElement: используется для определения элемента в файле XML. Устанавливает имя объекта.
@XmlElementWrapper (name = ‘имя, которое будет присвоено этой оболочке’): оно генерирует элемент-оболочку вокруг представления XML. Например, в приведенном выше примере будет сгенерировано <stateList>
вокруг каждого элемента <state>
2.State.java
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
|
package org.arpit.javapostsforlearning.jaxb;import javax.xml.bind.annotation.XmlRootElement;//Below statement means that class 'Country.java' is the root-element of our example@XmlRootElement(namespace = 'org.arpit.javapostsforlearning.jaxb.Country')public class State { private String stateName; long statePopulation; public State() { } public State(String stateName, long statePopulation) { super(); this.stateName = stateName; this.statePopulation = statePopulation; } public String getStateName() { return stateName; } public void setStateName(String stateName) { this.stateName = stateName; } public long getStatePopulation() { return statePopulation; } public void setStatePopulation(long statePopulation) { this.statePopulation = statePopulation; }} |
3.JAXBJavaToXml.java
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
|
package org.arpit.javapostsforlearning.jaxb;import java.io.File;import java.util.ArrayList;import javax.xml.bind.JAXBContext;import javax.xml.bind.JAXBException;import javax.xml.bind.Marshaller;public class JAXBJavaToXml { public static void main(String[] args) { // creating country object Country countryIndia=new Country(); countryIndia.setCountryName('India'); countryIndia.setCountryPopulation(5000000); // Creating listOfStates ArrayList<state> stateList=new ArrayList<state>(); State mpState=new State('Madhya Pradesh',1000000); stateList.add(mpState); State maharastraState=new State('Maharastra',2000000); stateList.add(maharastraState); countryIndia.setListOfStates(stateList); try { // create JAXB context and initializing Marshaller JAXBContext jaxbContext = JAXBContext.newInstance(Country.class); Marshaller jaxbMarshaller = jaxbContext.createMarshaller(); // for getting nice formatted output jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE); //specify the location and name of xml file to be created File XMLfile = new File('C:\\arpit\\CountryRecord.xml'); // Writing to XML file jaxbMarshaller.marshal(countryIndia, XMLfile); // Writing to console jaxbMarshaller.marshal(countryIndia, System.out); } catch (JAXBException e) { // some exception occured e.printStackTrace(); } }} |
После запуска вышеуказанной программы вы получите следующий вывод
Консольный вывод:
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
|
<?xml version='1.0' encoding='UTF-8' standalone='yes'?><country xmlns:ns2='org.arpit.javapostsforlearning.jaxb.Country'> <countryName>India</countryName> <countryPopulation>5000000.0</countryPopulation> <stateList> <state> <stateName>Madhya Pradesh</stateName> <statePopulation>1000000</statePopulation> </state> <state> <stateName>Maharastra</stateName> <statePopulation>2000000</statePopulation> </state> </stateList></country> |
Теперь мы будем читать сгенерированный выше XML и извлекать из него объект страны.
4.JAXBXMLToJava.java
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
|
package org.arpit.javapostsforlearning.jaxb;import java.io.File;import java.util.ArrayList;import javax.xml.bind.JAXBContext;import javax.xml.bind.JAXBException;import javax.xml.bind.Unmarshaller;public class JAXBXMLToJava { public static void main(String[] args) { try { // create JAXB context and initializing Marshaller JAXBContext jaxbContext = JAXBContext.newInstance(Country.class); Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller(); // specify the location and name of xml file to be read File XMLfile = new File('C:\\arpit\\CountryRecord.xml'); // this will create Java object - country from the XML file Country countryIndia = (Country) jaxbUnmarshaller.unmarshal(XMLfile); System.out.println('Country Name: '+countryIndia.getCountryName()); System.out.println('Country Population: '+countryIndia.getCountryPopulation()); ArrayList<state> listOfStates=countryIndia.getListOfStates(); int i=0; for(State state:listOfStates) { i++; System.out.println('State:'+i+' '+state.getStateName()); } } catch (JAXBException e) { // some exception occured e.printStackTrace(); } }} |
После запуска вышеуказанной программы вы получите следующий вывод:
Консольный вывод:
|
1
2
3
4
|
Country Name: IndiaCountry Population: 5000000.0State:1 Madhya PradeshState:2 Maharastra |
Преимущества JAXB:
- Это очень просто использовать, чем парсер DOM или SAX
- Мы можем упорядочить XML-файл для других целей данных, таких как inputStream, URL, DOM-узел.
- Мы можем удалить файл XML из других целей данных.
- Нам не нужно знать о методах синтаксического анализа XML.
- Нам не нужно всегда обращаться к XML в древовидной структуре.
Недостатки JAXB:
- JAXB — это высокоуровневый API, поэтому он меньше контролирует синтаксический анализ, чем SAX или DOM.
- У него есть некоторые накладные задачи, поэтому он медленнее, чем SAX.
Исходный код:
Ссылка: Учебное пособие по JAXB — Начало работы от нашего партнера по JCG Арпит Мандлия в блоге по фреймворкам Java и шаблонам проектирования для начинающих .


