JAXB parses XML file to null only Attributes are set in the object

I have information as an XML file. To use them, I want to parse XML in objects through JAXB .
My only problem is that all child notes after parsing are null . Only processed attributes.

root class:

 package xml; import java.util.Date; import java.util.List; import javax.xml.bind.annotation.XmlAttribute; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; import xml.messstrecke.ZEBMessstrecke; @XmlRootElement(name = "RohdatenTP2Netz", namespace = "http://www.BASt.de/ZEB/Rohdaten/Version_3_0") public class RohdatenTP2Netz { //Attributes private String merkmal; private String typ; private Date erstelldatum; private String bemerkung; //List of Childs private List<ZEBMessstrecke> zebMessstrecken; public @XmlAttribute(name = "Merkmal", required = true) String getMerkmal() { return merkmal; } public void setMerkmal(String merkmal) { this.merkmal = merkmal; } public @XmlAttribute(name = "Typ", required = true) String getTyp() { return typ; } public void setTyp(String typ) { this.typ = typ; } public @XmlAttribute(name = "Erstelldatum", required = true) Date getErstelldatum() { return erstelldatum; } public void setErstelldatum(Date erstelldatum) { this.erstelldatum = erstelldatum; } public @XmlAttribute(name = "Bemerkung", required = true) String getBemerkung() { return bemerkung; } public void setBemerkung(String bemerkung) { this.bemerkung = bemerkung; } public @XmlElement(required = true, type = ZEBMessstrecke.class) List<ZEBMessstrecke> getZebMessstrecken() { return zebMessstrecken; } public void setZebMessstrecken(List<ZEBMessstrecke> zebMessstrecken) { this.zebMessstrecken = zebMessstrecken; } } 

child class for ZEBMessstrecke:

 package xml.messstrecke; import java.util.List; import javax.xml.bind.annotation.XmlAttribute; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; import xml.messstrecke.datenstrom.Datenstrom; @XmlRootElement(namespace="http://www.BASt.de/ZEB/Rohdaten/Version_3_0") public class ZEBMessstrecke { //Attribute private String mnr; private String mra; //KindElemente private ZEBHeader header; private List<Datenstrom> datenstroeme; public @XmlAttribute(name = "mnr", required = true) String getMnr() { return mnr; } public void setMnr(String mnr) { this.mnr = mnr; } public @XmlAttribute(name = "mra", required = true) String getMra() { return mra; } public void setMra(String mra) { this.mra = mra; } public @XmlElement(name = "ZEBHeader", required = true) ZEBHeader getHeader() { return header; } public void setHeader(ZEBHeader header) { this.header = header; } public @XmlElement(name = "Datenstrom", required = true) List<Datenstrom> getDatenstroeme() { return datenstroeme; } public void setDatenstroeme(List<Datenstrom> datenstroeme) { this.datenstroeme = datenstroeme; } } 

xml file:

 <?xml version="1.0" encoding="UTF-8" standalone="no"?> <RohdatenTP2Netz Merkmal="Griffigkeit" Typ="Netzorientiert" Erstelldatum="2012-09-28" xmlns="http://www.BASt.de/ZEB/Rohdaten/Version_3_0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Bemerkung=""> <ZEBMessstrecke mnr="357/11" mra="0.4"> <ZEBHeader> <Bildparameter Datentraeger="LISt__BSt_12_001"> <Messpunktabstand_Bilder>1 Wert pro 10 Meter</Messpunktabstand_Bilder> <Kamera Nr="1" Name="Frontkamera" PixelH="720" PixelV="576" Bildformat="jpg" RootVerzeichnis="Kamera_01\B 096_"/> </Bildparameter> <Zusatzparameter/> <MapInfoStrassennetz Pfad_und_Basisname="ZEB2012B_1400_GRUNDDATEN_V_1_0_0"> <DAT>X</DAT> <ID>X</ID> <MAP>X</MAP> <TAB>X</TAB> </MapInfoStrassennetz> <ZEBAdministration Jahr="2012" Strassenklasse="B" ZENDI="140000" Anlass="Zwischentermin2" Dateiversion="1"/> <Messparameter Messsystem="SKM" KfzKennz="MW-LI 21" Messgeraetebauer="BfW Traunstein" Messsystembetreiber="LISt GmbH Rochlitz" Messprinzip="schraeggestelltes Rad" Fahrer="Schmidt" Operator="Pusch" Positionsbestimmungsverfahren="DGPS"> <Messpunktabstand_Messgeschwindigkeit>1 Wert pro 1 Meter</Messpunktabstand_Messgeschwindigkeit> <Messpunktabstand_Fahrbahntemperatur>1 Wert pro 1 Meter</Messpunktabstand_Fahrbahntemperatur> <Messpunktabstand_Reifentemperatur>1 Wert pro 1 Meter</Messpunktabstand_Reifentemperatur> <Messpunktabstand_Lufttemperatur>1 Wert pro 1 Meter</Messpunktabstand_Lufttemperatur> <Messpunktabstand_Wassertemperatur>1 Wert pro 1 Meter</Messpunktabstand_Wassertemperatur> <Messpunktabstand_Seitenkraftbeiwert>1 Wert pro 1 Meter</Messpunktabstand_Seitenkraftbeiwert> <Messpunktabstand_Seitenabstand>1 Wert pro 1 Meter</Messpunktabstand_Seitenabstand> <Messlinie>rechte Rollspur</Messlinie> </Messparameter> </ZEBHeader> <Datenstrom LfdM="511" Datum="2012-05-31" Uhr="11:19:57" G="0" Bemerkung="" mrl="0" /> <Datenstrom LfdM="525" Datum="2012-05-31" Uhr="11:19:58" G="0" Bemerkung="" mrl="0" /> </ZEBMessstrecke> </RohdatenTP2Netz> 
+1
source share
3 answers

You need to use the @XmlSchema package level annotation to indicate the qualification of the namespace for the classes in each of your packages.

XML / package-info.java

 @XmlSchema( namespace = "http://www.BASt.de/ZEB/Rohdaten/Version_3_0", elementFormDefault = XmlNsForm.QUALIFIED) package xml; import javax.xml.bind.annotation.XmlNsForm; import javax.xml.bind.annotation.XmlSchema; 

XML / messstrecke / package-info.java

 @XmlSchema( namespace = "http://www.BASt.de/ZEB/Rohdaten/Version_3_0", elementFormDefault = XmlNsForm.QUALIFIED) package xml.messstrecke; import javax.xml.bind.annotation.XmlNsForm; import javax.xml.bind.annotation.XmlSchema; 

Additional Information

+1
source

Instead of this:

 public @XmlElement(required = true, type = ZEBMessstrecke.class) List<ZEBMessstrecke> getZebMessstrecken() 

You should use:

 @XmlList @XmlElement(required = true, type = ZEBMessstrecke.class) public List<ZEBMessstrecke> getZebMessstrecken() 
0
source

Your @XmlElement annotation is on the getZebMessstrecken method, so it will look for an element named zebMessstrecken , not ZEBMessstrecke . You must make the element name explicit, i.e.

 @XmlElement(name = "ZEBMessstrecke", required = true) 

Furthermore, the usual way for JAXB to display the maxOccurs="unbounded" element is to generate only a getter, not a setter, and have getter return an empty list on the first call. The pattern is for the caller to receive the List from the receiver, and then add the items to the list directly. So try something like:

 @XmlElement(name = "ZEBMessstrecke", required = true) public List<ZEBMessstrecke> getZebMessstrecken() { if(zebMessstrecken == null) { zebMessstrecken = new ArrayList<ZEBMessstrecke>(); } return zebMessstrecken; } // no setZebmessstrecken method 

You do not need type , since it can be inferred from the return type of the method.

Edit: Also make sure you have the correct namespace in the @XmlType annotation for the ZEBMessstrecke class.

0
source

All Articles