我在访问包含可选标记的解组XML文件的字段方面存在问题。下面是一个简单的例子,我做了一个更复杂的情况:Java - 使用可选字段解组JAXB XML
<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