JAXB教程
时间:2020-02-23 14:35:17 来源:igfitidea点击:
什么是JAXB?
JAXB代表XML绑定的Java架构。
它用于将XML转换为Java对象,Java对象到XML.JAXB定义了用于读取和从XML文档中读取和写入Java对象的API.UNLIKE SAX和DOM,我们不需要要意识到XML解析技术。
我们可以使用JAXB执行两个操作
- 编组:将Java对象转换为XML
- Unmarshalling:将XML转换为Java对象
JAXB教程
我们将创建一个Java程序到Marshal和Unmarshal。
用于编组:
对于解释:
Java程序:
借助JAXB提供的注释和API,将Java对象转换为XML,反之亦然变得非常容易。
1.Country.java.
一个Java对象将用于转换往返XML
在src-> org.igi.javapostssforlearning.jaxb中创建country.java.javapostsforlearning.jaxb
package org.igi.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; } }< /pre>
@xmlrootelement:此注释定义了XML文件的根元素。
@xmltype(proporder = {"属性列表"}):这用于定义XML文件中的元素顺序。
这是可选的。
@XmlElement:这用于定义XML文件中的元素。
它的实体名称。
@xmlelementwrapper(name ="名称要提供给该包装器"):它会在XML表示周围生成一个包装元素。
在上面的示例中,它将生成每个元素
2.State.java.
package org.igi.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.igi.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.jaxbavatoxml.java.
package org.igi.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 countryNetherlands=new Country(); countryNetherlands.setCountryName("Netherlands"); countryNetherlands.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); countryNetherlands.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:\igi\CountryRecord.xml"); //Writing to XML file jaxbMarshaller.marshal(countryNetherlands, XMLfile); //Writing to console jaxbMarshaller.marshal(countryNetherlands, System.out); } catch (JAXBException e) { //some exception occured e.printStackTrace(); } } }
在运行上面的程序后,我们将获得以下输出
控制台输出:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <country xmlns:ns2="org.igi.javapostsforlearning.jaxb.Country"> <countryName>Netherlands</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并从中检索Country对象。
4.jaxbxmltojava.java.
package org.igi.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:\igi\CountryRecord.xml"); //this will create Java object - country from the XML file Country countryNetherlands = (Country) jaxbUnmarshaller.unmarshal(XMLfile); System.out.println("Country Name: "+countryNetherlands.getCountryName()); System.out.println("Country Population: "+countryNetherlands.getCountryPopulation()); ArrayList<State> listOfStates=countryNetherlands.getListOfStates(); int i=0; for(State state:listOfStates) { i++; System.out.println("State:"+i+" "+state.getStateName()); } } catch (JAXBException e) { //some exception occured e.printStackTrace(); } } }
在运行上面的程序后,我们将获得以下输出
控制台输出:
Country Name: Netherlands 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。
- 它有一些开销任务,因此它比萨克斯慢。