JAXB从未映射到对象根元素@XmlRootElement的XML标记创建对象
我有个问题 我有以下XML:JAXB从未映射到对象根元素@XmlRootElement的XML标记创建对象,jaxb,Jaxb,我有个问题 我有以下XML: <vehicles> <Train name="train1" /> <Train name="train2" /> <Train name="train3" /> <Car name="car1" /> <Car name="car2" /> <Car name="car3" /> </vehicles> 现在,我尝试使用JAXB从调
<vehicles>
<Train name="train1" />
<Train name="train2" />
<Train name="train3" />
<Car name="car1" />
<Car name="car2" />
<Car name="car3" />
</vehicles>
现在,我尝试使用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;
}
bindObjectsFromXml(文件,Car.class);
公共静态列表bindObjectsFromXml(文件文件,类klazz,字符串[]rootElementsNames)引发异常
{
列表对象=新建LinkedList();
XMLStreamReader=getXMLStreamReader(文件);
JAXBContext context=JAXBContext.newInstance(klazz);
Unmarshaller Unmarshaller=context.createUnmarshaller();
xmlStreamReader.nextTag();
for(String rootElement:rootElementsNames)//可能有多个根需要跳过
{
require(XMLStreamConstants.START_元素,null,rootElement);
xmlStreamReader.nextTag();
}
while(xmlStreamReader.getEventType()==XMLStreamConstants.START\u元素)
{
JAXBElement=unmarshaller.unmarshal(xmlStreamReader,klazz);
T klazzInstance=jaxbElement.getValue();
添加(klazzInstance);
if(xmlStreamReader.getEventType()==XMLStreamConstants.CHARACTERS)
{
xmlStreamReader.next();
}
}
归还物品;
}
问题是我也从火车上得到了汽车物体
我不明白为什么解组器会忽略@XmlRootElement(name=“Car”)
你能帮我做这个吗
非常感谢您。您需要确保您的
JAXBContext
知道要映射到的所有类。在示例代码中,您在Car.class
上构建JAXBContext
,这样它就不会知道Train.class
。您需要执行以下操作:
JAXBContext jc = JAXBContext.newInstance(Car.class, Train.class);
bindObjectsFromXml
的参数不匹配。你用2个参数调用它,并声明3个参数。而且,“我也从火车上得到汽车对象”也没有意义。请解释清楚一点。
JAXBContext jc = JAXBContext.newInstance(Car.class, Train.class);