我遇到了使用 jaxb 的 xml 问题。我希望能够生成这样的 xml 文件:
<Animals>
<Animal type="A">
<name>aaaa</name>
<j>text1</j>
</Animal>
<Animal type="A">
<name>bbbb</name>
<j>text3</j>
</Animal>
<Animal type="A">
<name>cccc</name>
<j>text5</j>
</Animal>
<Animal type="B">
<name>vvvvv</name>
<i>3</i>
</Animal>
<Animal type="B">
<name>ffff</name>
<i>4</i>
</Animal>
<Animal type="B">
<name>zzzz</name>
<i>7</i>
</Animal>
这两种类型有一些相似的元素和一些特殊的元素。例如,j 是必需的,如果 type="A",则不应为 null;如果 type="B",则 i 是必需的,不应为 null。这可能吗?
这是动物类:
@XmlRootElement(name = "Animals")
@XmlAccessorType(XmlAccessType.FIELD)
public class Animals {
@XmlElement(name="Animal")
private List<AnimalA> listA;
@XmlElement(name="Animal")
private List<AnimalB> listB;
//Getters and Setters
...
//Constructors
...
} 来测试它,这里是一个主要的功能:
public static void main(String[] args) {
System.out.println("Starting here...");
AnimalA a = new AnimalA("animalA", "valueA");
AnimalB b = new AnimalB("animalB", "valueb",3);
AnimalB b2 = new AnimalB("animalB2", "valueb2",56);
List<AnimalA> listA = new ArrayList<AnimalA>();
List<AnimalB> listB = new ArrayList<AnimalB>();
listA.add(a);
listB.add(b);
listB.add(b2);
Animals animals = new Animals(listA,listB);
JAXBContext context = null;
try {
context = JAXBContext.newInstance(Animals.class);
Marshaller m = context.createMarshaller();
m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
if (animals != null) {
m.marshal(animals, new File("C:\\animalz.xml"));
}
} catch (JAXBException e) {
System.out.println(e);
}
Animals aa = null;
URL url = null;
try {
url = new File("C:\\animalz.xml").toURI().toURL();
Unmarshaller unmarshaller = context.createUnmarshaller();
aa = (Animals) unmarshaller.unmarshal(url);
int countA = aa.getListA().size();
// int countB = aa.getListB().size();
System.out.println("size A==>"+countA);
// System.out.println("size B ==>"+countB);
} catch (JAXBException e) {
System.out.println(e.getMessage());;
} catch (MalformedURLException e) {
System.out.println(e.getMessage());;
}
}
这将返回: 从这里开始... size A==>3 如果我取消注释 CountB 的行,它会得到一个 NullPointerexception。