Я хочу прочитать в xml-файле, основанном на jaxb, свою структуру с указанием объекта.
Допустим, это мой xml-файл:
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<children xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<child xsi:type="girl">
<age>12</age>
<isdancing>true</isdancing>
</child>
<child xsi:type="boy">
<age>10</age>
<issoccerplayer>true</issoccerplayer>
</child>
</children>
children - это некоторый элемент-обертка, включающий несколько дочерних элементов. child может быть либо мальчиком, либо девочкой, указанной в xsi: type. Эти два класса имеют некоторые общие элементы (например, age ) и некоторые различные (исключая) элементы (например, isdancing или issoccerplayer )
Toпрочитайте файл, у меня есть этот метод:
public static void main( String[] args ) throws JAXBException
{
JAXBContext jaxbContext;
jaxbContext = JAXBContext.newInstance(Children.class);
Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
File file = new File("C:/test.xml");
if (!file.exists()) System.out.println("File does not exist");
Children children = (Children) jaxbUnmarshaller.unmarshal(file);
System.out.println(children.toString());
}
Мой класс детей выглядит следующим образом:
@XmlRootElement(name="children")
@XmlAccessorType(XmlAccessType.FIELD)
public class Children {
@XmlElement(name="child")
private List<Child> childrenList;
public List<Child> getChildren() { return childrenList; }
public void setChildren(List<Child> children) {this.childrenList = children;}
@Override
public String toString() {
return ReflectionToStringBuilder.toString(this);
}
}
Мой класс ребенка выглядит следующим образом:
@XmlAccessorType(XmlAccessType.FIELD)
public class Child {
@XmlAttribute(name="xsi:type")
private XsiType xsiType;
private int age;
@XmlElement(name = "isdancing")
private boolean isDancing;
@XmlElement(name = "issoccerplayer")
private boolean isSoccerPlayer;
//Getter and setter for all fields
@Override
public String toString() {
return ReflectionToStringBuilder.toString(this);
}
}
И мой класс XsiType выглядит следующим образом:
@XmlAccessorType(XmlAccessType.FIELD)
public class XsiType {
@XmlAttribute(name="xsi:type")
private String name;
@XmlValue
private String value;
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public String getValue() { return value;
public void setValue(String value) { this.value = value; }
}
В моем файле pom.xml я включил следующие зависимости:
<dependencies>
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.1</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.9</version>
</dependency>
</dependencies>
Моя проблема в том, что вывод в порядке, ноэлемент xsiType класса Child всегда имеет значение null или в противном случае он заканчивается в IllegalAnnotationExceptions, которые связаны с XmlTest.model.Child.xsiType
Так что я ожидаю, что при установке любого вида @ Xml- возникает ошибкаАннотация. Может ли кто-нибудь помочь мне, обнаружив ошибку?
Цель состоит в том, чтобы перебрать список детей и решить во время выполнения (на основе xsiType), является ли это девочка или мальчик.
Спасибо