【发布时间】:2017-04-06 10:35:44
【问题描述】:
我在访问包含可选标签的未编组 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是一个方法并返回一个列表? -
您的 XML 示例也可能是错误的,因为
<pet>不包括<name>,而是Dog和Cat。 -
你是对的,如果这是一个不好的例子,我很抱歉,但我只是为了说明一个简单的例子而临时做的。这些字段可以替换为任何内容。至于 .get(i),我将更新我的帖子以包含一个 for 循环。谢谢。
标签: java xml nullpointerexception jaxb