JAXB Unmarshalling не работает. Ожидаемые элементы (нет)

Я пытаюсь размонтировать XML.

Это то, что мой XML выглядит как

<DeviceInventory2Response xmlns="http://tempuri.org/">
<DeviceInventory2Result xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
  <Obj123 xmlns="">
     <Id>1</Id>
     <Name>abc</Name>
  </Obj123>
  <Obj456 xmlns="">
  .
  .
  .

Я пытаюсь получить идентификатор и имя под Obj123. Однако, когда я запускаю свою команду unmarshal, я получаю следующую ошибку.

An Error:  javax.xml.bind.UnmarshalException: unexpected element (uri:"http://tempuri.org/", local:"DeviceInventory2Response"). Expected elements are (none)

Мой код выглядит так в основном классе:

Obj123 myObj123 = (Obj123) unmarshaller.unmarshal(inputSource);

И мой класс для Obj123 выглядит так:

package com.myProj.pkg;

import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementWrapper;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;


@XmlRootElement(name="Obj123")
public class Obj123 {

  private String Id;
  private String Name;

  public String getId() {
    return Id;
  }

  public String getName() {
    return Name;
  }
}

Я подумал, установив свой XMLRootElement, чтобы я мог пропустить первые 2 строки моего XML, но это, похоже, не происходит. Любые идеи?

Edit:

Вот как заключен мой контекст JAXB:

JAXBContext jaxbContext = JAXBContext.newInstance();
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
Obj123 obj123 = (Obj123) unmarshaller.unmarshal(xmlStreamReader);

Ответы

Ответ 1

Реализации JAXB будут пытаться соответствовать корневому элементу документа (а не дочернему элементу). Если вы хотите размонтировать середину XML-документа, тогда вы можете проанализировать документ с помощью StAX, переместив XMLStreamReader в нужный элемент, а затем отмените его.

Дополнительная информация

UPDATE

теперь я получаю следующую ошибку. Ошибка: javax.xml.bind.UnmarshalException - со связанным исключением: [javax.xml.bind.UnmarshalException: неожиданный элемент (uri: ", локальный:" Obj123"). Ожидаемые элементы: (none)].

A JAXBContext знает только о классах, о которых вы рассказываете. Вместо:

JAXBContext jaxbContext = JAXBContext.newInstance();

Вам нужно сделать:

JAXBContext jaxbContext = JAXBContext.newInstance(Obj123.class);

Ответ 2

Я решил проблему, добавив

@XmlRootElement(name="abc_xxx") в класс Root.
(где abc_XXX является корневым тегом вашего XML)

Классы JAXB, сгенерированные eclipse, не добавили эту аннотацию в мой корневой класс.

Ответ 3

Вместо этого используйте класс ObjectFactory, например

JAXBContext jaxbContext = null;
try {
    jaxbContext = JAXBContext.newInstance(ObjectFactory.class);
} catch (JAXBException e) {
    e.printStackTrace();
}

JAXBElement<ObjectFactory> applicationElement = null;
try {
    applicationElement = (JAXBElement<ObjectFactory>)
    unmarshaller.unmarshal(Thread.currentThread().getClass()
        .getResourceAsStream(fileName));
} catch (JAXBException e) {
    e.printStackTrace();
}

Попробуйте это и решите проблему выше. Моя проблема решена.

Ответ 4

@david. Моя проблема решена после попытки вашего решения.