Примечание. Ознакомьтесь с нашим учебником по 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: India Country Population: 5000000.0 State: 1 Madhya Pradesh State: 2 Maharastra |
Преимущества JAXB:
- Это очень просто использовать, чем парсер DOM или SAX
- Мы можем упорядочить XML-файл для других целей данных, таких как inputStream, URL, DOM-узел.
- Мы можем удалить файл XML из других целей данных.
- Нам не нужно знать о методах синтаксического анализа XML.
- Нам не нужно всегда обращаться к XML в древовидной структуре.
Недостатки JAXB:
- JAXB — это высокоуровневый API, поэтому он меньше контролирует синтаксический анализ, чем SAX или DOM.
- У него есть некоторые накладные задачи, поэтому он медленнее, чем SAX.
Исходный код:
Ссылка: Учебное пособие по JAXB — Начало работы от нашего партнера по JCG Арпит Мандлия в блоге по фреймворкам Java и шаблонам проектирования для начинающих .