Я пытаюсь разобрать простой файл XML, например:
<customer id = "100">
<age value = " 29"/>
<name value = "Bob"/>
</customer>
Я использовал библиотеку JAX таким образом:
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Customer {
@XmlAttribute(name = "id")
String id;
@XmlAttribute(name = "value")
String value;
String name;
String age;
public String getName() {
return name;
}
@XmlElement(name = "value")
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
@XmlElement(name = "value")
public void setAge(String age) {
this.age = age;
}
public String getId() {
return id;
}
@XmlElement(name = "id")
public void setId(String id) {
this.id = id;
}
}
Существует исключение IllegalAnnotationException. У меня истек срок действия этой ссылки: здесь, но безуспешно.
Мой файл XML не может измениться, извините за это. Пример взят отсюда: mkyong.com/java/jaxb-hello-world-пример, но отчет xml в моем случае
Поскольку значения «имя» и «возраст» на самом деле являются атрибутами дочерних узлов, вы должны извлечь их в отдельный класс, например:
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public static class Customer {
@XmlAttribute
String id;
@XmlElement
NameAgeValue name;
@XmlElement
NameAgeValue age;
public String getId() {
return id;
}
public String getAge() {
return (age == null) ? null : age.value;
}
public String getName() {
return (name == null) ? null : name.value;
}
}
@XmlType
public static class NameAgeValue {
@XmlAttribute
String value;
}
У меня кстати только id=100, а имя и возраст пустые(" ")
Я проверил свой код на вашем примере XML. getAge
и getName
проанализированного объекта возвращают ожидаемый результат.
осторожный класс NameAgeValue должен быть в основных скобках класса Customer, а класс Customer не статичен;)
@OutOfMemoryError это фрагмент из тестового класса, поэтому Customer
также является статическим внутренним
age
иname
не являются атрибутами в вашем XML. Это дочерние узлы. Если бы ваш XML был чем-то вроде<customer id = "100" age = "29" name = "Bob">...
, он был бы другим. Тогдаage
иname
будут прямыми атрибутами вашего узлаcustomer
.