net - unmarshal java
JAXB Unmarshalling no funciona. Los elementos esperados son(ninguno) (3)
Estoy tratando de desmarcar un XML.
Así es como se ve mi 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="">
.
.
.
Estoy tratando de obtener Id y Nombre bajo Obj123. Sin embargo, cuando ejecuto mi comando unmarshal obtengo el siguiente error.
An Error: javax.xml.bind.UnmarshalException: unexpected element (uri:"http://tempuri.org/", local:"DeviceInventory2Response"). Expected elements are (none)
Mi código se ve así en la clase principal:
Obj123 myObj123 = (Obj123) unmarshaller.unmarshal(inputSource);
Y mi clase para Obj123 se ve así:
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;
}
}
Pensé al configurar mi XMLRootElement que debería poder omitir las primeras 2 líneas de mi XML pero eso no parece estar sucediendo. ¿Algunas ideas?
Editar:
Así es como se hace mi Contexto JAXB:
JAXBContext jaxbContext = JAXBContext.newInstance();
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
Obj123 obj123 = (Obj123) unmarshaller.unmarshal(xmlStreamReader);
Las implementaciones de JAXB intentarán coincidir en el elemento raíz del documento (no en un elemento secundario). Si desea desmarcar al medio de un documento XML, puede analizar el documento con StAX y avanzar el XMLStreamReader
al elemento deseado y luego desmarcarlo.
Para más información
ACTUALIZAR
Ahora estoy recibiendo el siguiente error. Un error: javax.xml.bind.UnmarshalException - con excepción vinculada: [javax.xml.bind.UnmarshalException: elemento inesperado (uri: "", local: "Obj123"). Los elementos esperados son (ninguno)].
Un JAXBContext
solo conoce las clases sobre las que se cuenta. En lugar de:
JAXBContext jaxbContext = JAXBContext.newInstance();
Necesitas hacer:
JAXBContext jaxbContext = JAXBContext.newInstance(Obj123.class);
Resolví el problema agregando
@XmlRootElement(name="abc_xxx")
a la clase Root.
(donde abc_XXX es la etiqueta raíz de su XML)
Las clases JAXB generadas por eclipse no agregaron esta anotación a mi clase raíz.
Utilice la clase ObjectFactory en lugar de
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();
}
Intenta esto y resolverá el problema anterior. Mi problema ha sido resuelto.