Как сказать JAXB, что этот элемент - Дитя Корня? - PullRequest
0 голосов
/ 02 мая 2019

У меня есть некоторые тестовые данные в формате XML, которые я хочу сопоставить с POJO.

<Root>
   <Child1>
      <Data>
      </Data>
   </Child1>
   <Child2>
      <Data>
      </Data>
   </Child2>
</Root>

Child1 - первый объект, а Child2 - второй.

JAXBContext context = JAXBContext.newInstance(classesToLoad);
Unmarshaller um = context.createUnmarshaller();
Object obj = (Object) um.unmarshal(data);

Объект в данном случае просто заполнитель

@Getter
@Setter
@XmlRootElement(name = "TestData")
public class Child1 {

    @XmlElement(name = "ID")
    private String ID;
}

.

Это код, с которым я сейчас работаю, но я получаю это исключение:

javax.xml.bind.UnmarshalException: непредвиденный элемент (URI: "", локальный: "TestData").Возможные элементы: Child1

1 Ответ

1 голос
/ 02 мая 2019

Переместите аннотацию

@XmlRootElement(name = "TestData")

в свой корневой класс и измените его на

@XmlRootElement(name = "Root")

И я верю, что вынужно

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "Child1")

в классе Child1.

И повторить попытку.

Исключение говорит о том, что он ожидает элемент имени TestData с пространством имен ""(вы можете пока игнорировать пространство имен, так как оно пустое, но потратьте минуту или две, чтобы взглянуть на this , поскольку это то, что может сбить вас с толку при работе с XML в первый раз), и это потому, чтовы определяете корневой элемент как TestData.

Кроме того, приведенный вами пример данных не соответствует вашему разработанному классу.

<Child1>
    <Data>
    </Data>
</Child1>

public class Child1 {

    @XmlElement(name = "ID")
    private String ID;
}

Я не знаю, если вы 'Мы заменили прилагаемые данные для краткости ради более простого вопроса, но ваш Java-объект будет более похож на этот XML.

<Child1>
   <ID>[String ID value]</ID>
</Child1>
...