Статьи

Учебник JAXB — Начало работы

Примечание. Ознакомьтесь с нашим учебником по JAXB для привязки Java XML — руководство по ULTIMATE

Что такое JAXB?

JAXB обозначает архитектуру Java для привязки XML. Он используется для преобразования XML в объект java и объект java в XML. JAXB определяет API для чтения и записи объектов Java в и из документов XML. В отличие от SAX и DOM, нам не нужно знать о методах парсинга XML.

Есть две операции, которые вы можете выполнить с помощью JAXB

  1. Marshalling : преобразование Java-объекта в XML
  2. 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 и шаблонам проектирования для начинающих .