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. Моя проблема решена после попытки вашего решения.