JAXB создал объекты из тегов XML, которые не сопоставлены с корневым элементом объекта @XmlRootElement - PullRequest
1 голос
/ 01 февраля 2012

У меня проблема.

У меня есть следующий 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 для генерации объектов Car из XML, вызывая следующий метод:

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

Проблема в том, что я получаю объект "Автомобиль" также с поезда.

Я не понимаю, почему демаршаллер игнорирует @XmlRootElement (name = "Car")?

Не могли бы вы помочь мне с этим?

Заранее большое спасибо.

1 Ответ

0 голосов
/ 02 февраля 2012

Вы должны убедиться, что ваш JAXBContext знает обо всех классах, которые вы хотите отобразить. В вашем примере кода вы строите JAXBContext на Car.class, поэтому он не будет знать о Train.class. Вам нужно будет сделать следующее:

JAXBContext jc = JAXBContext.newInstance(Car.class, Train.class);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...