JAXB unmarshal возвращает нулевые значения для атрибутов

#java #xml #jaxb

#java #xml #jaxb

Вопрос:

Не могли бы вы определить, почему мой код выводит [null, null, null, null]:

 Unmarshaller m = JAXBContext.newInstance(Roles.class).createUnmarshaller();
Roles root = m.ummarshal(new FileReader("test.xml"));
System.out.println(root);
  

Я пробовал отладку в eclipse, но точки останова в установщиках и получателях не попадают

test.xml

 <?xml version="1.0" encoding="UTF-8" ?>
<Roles>
 <Ele Id="1" Value="Yes"/>
 <Ele Id="2" Value="Yes"/>
 <Ele Id="3" Value="No"/>
 <Ele Id="4" Value="Yes"/>
</Roles>
  

Roles.java

 @XmlRootElement(name="Roles")
public class Roles {
 private List<Ele> EleList;
 public Roles() {super();}

 @XmlElement(name="Ele")
 public List<Ele> getEleList() {return EleList;}
 public void setEleList(List<Ele> EleList) {this.EleList = EleList;}
 public String toString() {return EleList.toString();}
}
  

Ele.java

 public class Ele {

 @XmlAttribute
 private String Id;

 @XmlAttribute
 private String Value;

 public Ele(){super();}

 public String getId() {return Id;}
 public void setId(String id) {Id = id;}
 public String getValue() {return Value;}
 public void setValue(String value) {Value = value;}

 public String toString() { if(Id == null || Value == null) return null; else return Id   Value;}
}
  

Комментарии:

1. В этом случае вы можете опубликовать это как ответ и принять через несколько дней.

Ответ №1:

Я решил проблему сам.

Вам нужно написать: @XmlAttribute(name="Id") amp; @XmlAttribute(name="Value") над getId() и getValue() вместо just @XmlAttribute . Имена идентификаторов не распознаются.

Ответ №2:

Проблема в том, что вы не соблюдаете соглашения об именовании Java: переменные должны начинаться со строчной буквы. Если бы вы использовали имена переменных и элементов в нижнем регистре, это работало бы без явного перечисления имен:

 @XmlAttribute
private String id;

public String getId() {return id;}
public void setId(String id) {id = id;}
  

и

 <?xml version="1.0" encoding="UTF-8" ?>
<Roles>
 <Ele id="1" value="Yes"/>
 <Ele id="2" value="Yes"/>
 <Ele id="3" value="No"/>
 <Ele id="4" value="Yes"/>
</Roles>