xmlrootelement unmarshal parse online jaxbunmarshaller jaxbcontext example bean java xml jaxb

unmarshal - parse xml java jaxb



javax.xml.bind.UnmarshalException: elemento inesperado(uri: "", local: "Grupo") (9)

unexpected element (uri:"", local:"Group"). Expected elements are <{}group>

Cumple una excepción al desasignar de xml

JAXBContext jc = JAXBContext.newInstance(Group.class); Unmarshaller unmarshaller = jc.createUnmarshaller(); Group group = (User)unmarshaller.unmarshal(new File("group.xml"));

La clase de grupo no tiene ninguna anotación y group.xml solo contiene datos.

Cualquier cosa puede ser la causa?


Afortunadamente, la clase de información del paquete no es obligatoria. Pude solucionar el problema de la mina con la solución iowatiger08.

Aquí está mi solución que muestra el mensaje de error para ayudar a unir los puntos para algunos.

Mensaje de error

javax.xml.bind.UnmarshalException: elemento inesperado (uri: " http://global.aon.bz/schema/cbs/archive/errorresource/0 ", local: "errorresource"). Los elementos esperados son <{} errorresource>

Código antes de corregir

@XmlAccessorType(XmlAccessType.FIELD) @XmlType(name="", propOrder={"error"}) @XmlRootElement(name="errorresource") public class Errorresource

Código después de corregir

@XmlAccessorType(XmlAccessType.FIELD) @XmlType(name="", propOrder={"error"}) @XmlRootElement(name="errorresource", namespace="http://global.aon.bz/schema/cbs/archive/errorresource/0") public class Errorresource

Puede ver el espacio de nombres agregado a @XmlRootElement como se indica en el mensaje de error.


Después de buscar más, el elemento raíz tiene que estar asociado con un espacio de nombres de esquema como Blaise está observando. Sin embargo, no tenía un paquete de información java. Entonces, sin usar la anotación @XMLSchema, pude corregir este problema usando

@XmlRootElement (name="RetrieveMultipleSetsResponse", namespace = XMLCodeTable.NS1) @XmlType(name = "ns0", namespace = XMLCodeTable.NS1) @XmlAccessorType(XmlAccessType.NONE) public class RetrieveMultipleSetsResponse {//...}

¡Espero que esto ayude!


Esta es una solución para un caso de uso bastante especial pero me atrapa cada vez. Si está utilizando el generador Eclipse Jaxb, crea un archivo llamado package-info.

@javax.xml.bind.annotation.XmlSchema(namespace = "blah.xxx.com/em/feed/v2/CommonFeed") package xxx.blah.mh.domain.pl3xx.startstop;

Si elimina este archivo, permitirá analizar un xml más genérico. ¡Darle una oportunidad!


Lo mismo para mí El nombre de la clase de mapeo era Mbean pero el nombre de raíz de la etiqueta era mbean así que tuve que agregar la anotación:

@XmlRootElement(name="mbean") public class MBean { ... }


Necesitas poner package-info.java en tu paquete jaxb generado. Su contenido debería ser algo así

@javax.xml.bind.annotation.XmlSchema(namespace = "http://www.example.org/StudentOperations/") package generated.marsh;


Parece que su documento XML tiene el elemento raíz "Grupo" en lugar de "grupo". Usted puede:

  1. Cambie el elemento raíz en su XML para que sea "grupo"
  2. Agregue la anotación @XmlRootElement (name = "Group") a las clases de grupo.

Si ninguno de los anteriores funciona, intente agregar

@XmlRootElement(name="Group") a las clases de grupo.


Tuve el mismo problema. Agregué los siguientes atributos a <xs:schema..> elementFormDefault = "qualified" attributeFormDefault = "no calificado"

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="http://www.example.com/schemas/ArrayOfMarketWithStations" targetNamespace="http://www.example.com/schemas/ArrayOfMarketWithStations" elementFormDefault="qualified" attributeFormDefault="unqualified" >

y volví a generar clases Java ejecutando xjc, que corrigió package-info.java.

@javax.xml.bind.annotation.XmlSchema(namespace = "http://www.example.com/schemas/ArrayOfMarketWithStations", elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED)

Esto solucionó el problema para mí.


Tuve el mismo problema. Me ayudó, especifico los mismos nombres de campo de mis clases que los nombres de las etiquetas en el archivo xml (el archivo proviene de un sistema externo).

Por ejemplo:

Mi archivo xml:

<Response> <ESList> <Item> <ID>1</ID> <Name>Some name 1</Name> <Code>Some code</Code> <Url>Some Url</Url> <RegionList> <Item> <ID>2</ID> <Name>Some name 2</Name> </Item> </RegionList> </Item> </ESList> </Response>

Mi clase de respuesta:

@XmlRootElement(name="Response") @XmlAccessorType(XmlAccessType.FIELD) public class Response { @XmlElement private ESList[] ESList = new ESList[1]; // as the tag name in the xml file.. // getter and setter here }

Mi clase ESList:

@XmlAccessorType(XmlAccessType.FIELD) @XmlRootElement(name="ESList") public class ESList { @XmlElement private Item[] Item = new Item[1]; // as the tag name in the xml file.. // getters and setters here }

Mi clase de artículo:

@XmlRootElement(name="Item") @XmlAccessorType(XmlAccessType.FIELD) public class Item { @XmlElement private String ID; // as the tag name in the xml file.. @XmlElement private String Name; // and so on... @XmlElement private String Code; @XmlElement private String Url; @XmlElement private RegionList[] RegionList = new RegionList[1]; // getters and setters here }

Mi clase RegionList:

@XmlRootElement(name="RegionList") @XmlAccessorType(XmlAccessType.FIELD) public class RegionList { Item[] Item = new Item[1]; // getters and setters here }

Mi clase DemoUnmarshalling:

public class DemoUnmarshalling { public static void main(String[] args) { try { File file = new File("..."); JAXBContext jaxbContext = JAXBContext.newInstance(Response.class); Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller(); jaxbUnmarshaller.setEventHandler( new ValidationEventHandler() { public boolean handleEvent(ValidationEvent event ) { throw new RuntimeException(event.getMessage(), event.getLinkedException()); } } ); Response response = (Response) jaxbUnmarshaller.unmarshal(file); ESList[] esList = response.getESList(); Item[] item = esList[0].getItem(); RegionList[] regionLists = item[0].getRegionList(); Item[] regionListItem = regionLists[0].getItem(); System.out.println(item[0].getID()); System.out.println(item[0].getName()); System.out.println(item[0].getCode()); System.out.println(item[0].getUrl()); System.out.println(regionListItem[0].getID()); System.out.println(regionListItem[0].getName()); } catch (JAXBException e) { e.printStackTrace(); } } }

Da:

1 Some name 1 Some code Some Url 2 Some name 2