2012-02-01 121 views
1

我遇到問題。JAXB從未映射到對象根元素的XML標籤創建對象@XmlRootElement

我有下面的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; } 
} 

現在我想以生成從XML調用以下方法車對象使用JAXB:

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

問題是我從Train中獲得Car對象。

我不明白爲什麼unmarshaller忽略@XmlRootElement(name =「Car」)?

你能幫我解決嗎?

非常感謝您提前。

+1

「bindObjectsFromXml」的參數不匹配。你用2個參數調用它,並聲明3個參數。 – skaffman 2012-02-01 16:27:20

+1

此外,「我也從列車中獲得Car對象」沒有任何意義。請更清楚解釋。 – skaffman 2012-02-01 16:28:06

回答

0

您需要確保JAXBContext知道您要映射到的所有類。在您的示例代碼中,您在Car.class上構建JAXBContext,因此它不會知道Train.class。您需要執行以下操作:

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