JAXB从未映射到对象根元素@XmlRootElement的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从调

我有个问题

我有以下XML:

<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);