我有一个问题。
我有以下XML:
<vehicles>
<Train name="train1" />
<Train name="train2" />
<Train name="train3" />
<Car name="car1" />
<Car name="car2" />
<Car name="car3" />
</vehicles>
我创建了一个对象:
@XmlRootElement(name="Car")
public class Car
{
private String name;
public Car() { super(); }
@XmlAttribute(name="name")
public String getName() { return name; }
public String setName(String name) { this.name = name; }
}
现在我正在尝试使用JAXB从XML生成Car对象,调用以下方法:
bindObjectsFromXml(file, Car.class);
public static <T> List<T> bindObjectsFromXml(File file, Class<T> klazz, String[] rootElementsNames) throws Exception
{
List<T> objects = new LinkedList<T>();
XMLStreamReader xmlStreamReader = getXMLStreamReader(file);
JAXBContext context = JAXBContext.newInstance(klazz);
Unmarshaller unmarshaller = context.createUnmarshaller();
xmlStreamReader.nextTag();
for ( String rootElement : rootElementsNames ) // there might be more than one root that we want to skip
{
xmlStreamReader.require( XMLStreamConstants.START_ELEMENT, null, rootElement );
xmlStreamReader.nextTag();
}
while ( xmlStreamReader.getEventType() == XMLStreamConstants.START_ELEMENT )
{
JAXBElement<T> jaxbElement = unmarshaller.unmarshal(xmlStreamReader, klazz);
T klazzInstance = jaxbElement.getValue();
objects.add( klazzInstance );
if (xmlStreamReader.getEventType() == XMLStreamConstants.CHARACTERS)
{
xmlStreamReader.next();
}
}
return objects;
}
问题是我也从火车上获得了Car对象。
我不明白为什么unmarshaller会忽略@XmlRootElement(name =“Car”)?
你能帮我解决这个问题吗?
非常感谢你。
答案 0 :(得分:0)
您需要确保JAXBContext
知道要映射到的所有类。在您的示例代码中,您在JAXBContext
上构建了Car.class
,因此它不会知道Train.class
。您需要执行以下操作:
JAXBContext jc = JAXBContext.newInstance(Car.class, Train.class);