JAXB从未映射到对象根元素@XmlRootElement的XML标记创建对象

时间:2012-02-01 16:20:07

标签: jaxb

我有一个问题。

我有以下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”)?

你能帮我解决这个问题吗?

非常感谢你。

1 个答案:

答案 0 :(得分:0)

您需要确保JAXBContext知道要映射到的所有类。在您的示例代码中,您在JAXBContext上构建了Car.class,因此它不会知道Train.class。您需要执行以下操作:

JAXBContext jc = JAXBContext.newInstance(Car.class, Train.class);