У меня проблемы с доступом к полям немаршаллированных XML-файлов, которые содержат необязательные теги. Вот простой пример, который я сделал для более сложного случая:Java - JAXB XML unmarshal с необязательными полями
<people>
<persons>
<person>
<id>222</id>
<pets>
<pet>
<name age="2">Harry</name>
</pet>
<pet>
<name>Tiffany</name>
</pet>
</pets>
</person>
<person>
<id>111</id>
<pets>
<pet value="1"></pet>
</pets>
<spouse>Frank</spouse>
</person>
</persons>
</people>
Обратите внимание, что второй человек имеет супругу и первый не делает. Кроме того, у домашних животных первого человека есть имена, а у домашних животных второго нет. У домашнего животного по имени Гарри также есть возрастный атрибут. Я пытаюсь показать, что мои XML-файлы могут иметь разные данные из-за необязательных полей.
Вот мои классы моделей для JAXB:
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class People {
@XmlElementWrapper
@XmlElement(name="person")
private List<Person> persons;
public List<Person> getPersons() {
return persons;
}
public void setPersons(List<Person> persons) {
this.persons= persons;
}
}
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Person {
@XmlElement
private int id;
@XmlElementWrapper
@XmlElement(name="pet")
private List<Pet> pets;
@XmlElement
private String spouse;
//getters and setters
}
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class pet {
@XmlAttribute
private int age;
@XmlValue
private String name;
//getters and setters
}
Теперь, давайте скажем, что я просто хочу, чтобы напечатать все имена домашних животных.
for (Person person : people.getPersons()) {
for (Pet pet : person.getPets()) {
System.out.println("Pet name: " + pet.getName());
}
}
Я получаю NullPointerException
, если внутренний тег отсутствует. Интересно достаточно, хотя, если вы просто искать поле в слое людей, он просто будет пропускать XML-тег, как если бы он не существует, как:
for (Person person : people.getPersons()) {
System.out.println("Spouse: " + person.getSpouse());
}
Эта команда работает даже при том, что первый человек не иметь супруга. Он просто предоставляет строку «null», которая хорошо работает для меня.
Решение, которое я пробовал, - обернуть каждое поле в операторе if
или try-catch
(я не хочу этого делать, поскольку есть сотни тегов XML). Дайте мне знать, если у вас есть предложения. Благодарю.
Отсутствует большое количество аннотаций XML. Кроме того, первые два примера одинаковы. Кроме того, 'people.getPerson(). Get (i) .getPet.getName' не имеет смысла, так как' getPet' является методом и возвращает список? – thatguy
Ваш XML-пример может быть неправильным, потому что '' не включает '', а 'Dog' и' Cat'. –
thatguy
Вы правы, я извиняюсь, если это был плохой пример, но я просто сделал это на лету, чтобы проиллюстрировать простой пример. Эти поля можно заменить чем угодно. Что касается .get (i), я обновляю сообщение, чтобы включить цикл for. Благодарю. – rj2700