Ich versuche, ein XML-Dokument zu entpacken:JAXB unmarshalling: Kind-Elemente sind null
<map>
<room id="1" name="Stairway" east="2"/>
<room id="2" name="Kitchen" north="4" south="3" west="1">
<object name="Hat"/>
</room>
<room id="3" name="Hallway" east="1" south="4">
<object name="Money"/>
</room>
<room id="4" name="Bathroom" south="2"/>
</map>
Und das XSD-Schema (durch ein Werkzeug generiert):
<xsd:schema attributeFormDefault="unqualified" elementFormDefault="qualified" version="1.0" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="map">
<xsd:complexType>
<xsd:sequence>
<xsd:element minOccurs="1" maxOccurs="unbounded" name="room">
<xsd:complexType>
<xsd:sequence>
<xsd:element minOccurs="0" maxOccurs="unbounded" name="object">
<xsd:complexType>
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
</xsd:sequence>
<xsd:attribute name="id" type="xsd:int" />
<xsd:attribute name="name" type="xsd:string" />
<xsd:attribute name="north" type="xsd:int" />
<xsd:attribute name="south" type="xsd:int" />
<xsd:attribute name="west" type="xsd:int" />
<xsd:attribute name="east" type="xsd:int" />
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
Dies sind die wichtigen Klassen-Modell :
Map.java
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {"rooms"})
@XmlRootElement(name = "map")
public class Map {
/**
* List of rooms contained in this map.
*/
@XmlElement(required = true)
protected List<Room> rooms;
/**
* Gets the value of the rooms property.
*
* <p>
* This accessor method returns a reference to the live list,
* not a snapshot. Therefore any modification you make to the
* returned list will be present inside the JAXB objects.
* This is why there is not a <CODE>set</CODE> method for the rooms property.
*
* <p>
* For example, to add a new item, do as follows:
* <pre>
* getRooms().add(newItem);
* </pre>
*
*
* <p>
* Objects of the following type(s) are allowed in the list
* {@link Room }
*
*
*/
public List<Room> getRooms() {
if (rooms == null) {
rooms = new ArrayList<Room>();
}
return this.rooms;
}
}
Room.java
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
"objects"
})
public class Room {
@XmlElement(required = true)
protected List<Object> objects;
@XmlAttribute(name = "id")
protected Integer id;
@XmlAttribute(name = "name")
protected String name;
@XmlAttribute(name = "north")
protected Integer north;
@XmlAttribute(name = "south")
protected Integer south;
@XmlAttribute(name = "west")
protected Integer west;
@XmlAttribute(name = "east")
protected Integer east;
/**
* Gets the value of the objects property.
*
* <p>
* This accessor method returns a reference to the live list,
* not a snapshot. Therefore any modification you make to the
* returned list will be present inside the JAXB objects.
* This is why there is not a <CODE>set</CODE> method for the objects property.
*
* <p>
* For example, to add a new item, do as follows:
* <pre>
* getObjects().add(newItem);
* </pre>
*
*
* <p>
* Objects of the following type(s) are allowed in the list
* {@link Object }
*
*
*/
public List<Object> getObjects() {
if (objects == null) {
objects = new ArrayList<Object>();
}
return this.objects;
}
/**
* Ruft den Wert der id-Eigenschaft ab.
*
* @return
* possible objects is
* {@link Integer }
*
*/
public Integer getId() {
return id;
}
/**
* Legt den Wert der id-Eigenschaft fest.
*
* @param value
* allowed objects is
* {@link Integer }
*
*/
public void setId(Integer value) {
this.id = value;
}
/**
* Ruft den Wert der name-Eigenschaft ab.
*
* @return
* possible objects is
* {@link String }
*
*/
public String getName() {
return name;
}
/**
* Legt den Wert der name-Eigenschaft fest.
*
* @param value
* allowed objects is
* {@link String }
*
*/
public void setName(String value) {
this.name = value;
}
/**
* Ruft den Wert der north-Eigenschaft ab.
*
* @return
* possible objects is
* {@link Integer }
*
*/
public Integer getNorth() {
return north;
}
/**
* Legt den Wert der north-Eigenschaft fest.
*
* @param value
* allowed objects is
* {@link Integer }
*
*/
public void setNorth(Integer value) {
this.north = value;
}
/**
* Ruft den Wert der south-Eigenschaft ab.
*
* @return
* possible objects is
* {@link Integer }
*
*/
public Integer getSouth() {
return south;
}
/**
* Legt den Wert der south-Eigenschaft fest.
*
* @param value
* allowed objects is
* {@link Integer }
*
*/
public void setSouth(Integer value) {
this.south = value;
}
/**
* Ruft den Wert der west-Eigenschaft ab.
*
* @return
* possible objects is
* {@link Integer }
*
*/
public Integer getWest() {
return west;
}
/**
* Legt den Wert der west-Eigenschaft fest.
*
* @param value
* allowed objects is
* {@link Integer }
*
*/
public void setWest(Integer value) {
this.west = value;
}
/**
* Ruft den Wert der east-Eigenschaft ab.
*
* @return
* possible objects is
* {@link Integer }
*
*/
public Integer getEast() {
return east;
}
/**
* Legt den Wert der east-Eigenschaft fest.
*
* @param value
* allowed objects is
* {@link Integer }
*
*/
public void setEast(Integer value) {
this.east = value;
}
}
Jetzt, wenn ich versuche, dass XML entordnen map.rooms
immer null ist, sollte die Liste der Zimmer sein.
Irgendeine Idee, was das verursacht und wie man es repariert?
try Variable umbenennen ändern von "Zimmer" bis " Raum ", oder setze den Namen" Raum "auf @XmlElement – Rustam
wow ich wusste irgendwie, dass es ein offensichtlicher war :) danke! – lenny