2016-07-29 7 views
2

ている私は、XMLドキュメントを非整列化しようとしています:JAXB非整列化:子要素が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> 

そして、(いくつかのツールで生成)XSDスキーマ:

<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> 

これらは重要なモデルクラスです:

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; 
    } 

} 

私はXML map.roomsは部屋のリストがあるはず、常にnullであることをアンマーシャリングしてみてください。

これを引き起こす原因と解決方法を教えてください。

+1

roomにあなたのリストの名前を変更、XmlElement

@XmlElement(name = "room", required = true) protected List<Room> rooms; 

のいずれかで名前を提供する必要がありますどちらかだと思います部屋を設定するか、名前を "room"に設定して@XmlElementにします。 – Rustam

+0

うわー私はちょっと分かりました。ありがとう! – lenny

答えて

2

私はあなたが「お部屋」から "に変数の名前を変更しようとする代わりにrooms

@XmlElement(required = true) 
protected List<Room> room; 
+0

この場合、回答に含める必要があります。 – GreenieMeanie

関連する問題