2011-03-05 684 views
66
unexpected element (uri:"", local:"Group"). Expected elements are <{}group> 

Meet una excepción cuando unmarshalling de xmljavax.xml.bind.UnmarshalException: elemento inesperado (uri: "", local: "Grupo")

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

clase Grupo no tiene ninguna anotación y grupo .xml solo contiene datos.

Cualquier cosa puede ser la causa?

+0

Para los que vienen aquí de una búsqueda, solo quiero comentar que esto puede deberse al uso de 'ObjectFactory' incorrecto de las fuentes generadas, que es más probable si está mezclando dos directorios de origen generados diferentes. – bbarker

Respuesta

79

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

  1. Cambiar el elemento raíz en el XML para ser "grupo"
  2. Añadir la anotación @XmlRootElement (name = "Grupo") a la classs Grupo.
+2

Resolvió el problema, ¡Gracias! Usé la segunda solución, @XmlRootElement (name = "Group"). Mi nombre de clase es Group, y el elemento raíz XML es Group, por lo que aún necesito name = "Group" – user496949

+1

Revisar: http://stackoverflow.com/questions/5203531/what-is-the-default-rule-for- jaxb-unmarshall-the-xml-data/5203585 # 5203585 –

+2

@BlaiseDoughan Tengo el problema exactamente opuesto, tengo '@XmlRootElement (name =" MB ") @XmlAccessorType (XmlAccessType.FIELD) @XmlType (name = "MB", propOrder = {"date", "time"}) ' pero obtengo' elemento inesperado (uri: "http: // xx.title.com/new/response ", local:" MB "). Los elementos esperados son <{}Date>, <{}MB>, <{}Time>' también tengo '@XmlElement (name =" Date ", required = true)' sobre cada campo. Where & Why ¿Está yendo mal? También he intentado eliminar '@ XmlRootElement'! –

28

Debe colocar package-info.java en su paquete jaxb generado. Su contenido debe ser algo así

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

Después de mirar más, el elemento raíz tiene que estar asociado con un esquema de espacio de nombres como Blaise está observando. Sin embargo, no tenía un paquete de información java. Así que sin el uso de la anotación @XMLSchema, yo era capaz de corregir este problema utilizando

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

Espero que esto ayude!

+0

añadiendo un espacio de nombres a un elemento raíz rocks!: -) –

0

Lo mismo para mí. El nombre de la clase de mapeo fue Mbean pero el nombre de la raíz etiqueta era mbean por lo que tuvo que añadir la anotación:

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

Por suerte, no se requiere la clase de paquete-información. 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"). elementos previstos son < {} errorresource>

Código antes de fijar

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

Código después del arreglo

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

Se puede ver el espacio de nombres añadido a @XmlRootElement como se indica en el mensaje de error.

1

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 
2

Ésta es una solución para un caso bastante nicho de uso 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!

+1

Se hizo perfecto después de eso ... Muchas gracias amigo ... :). Acabo de mencionar el espacio de nombres como cadena vacía. – Arundev

0

Si ninguno de lo anterior funciona, trate de añadir

@XmlRootElement(name="Group") a la classs Grupo.

0

Para mí, la razón simple fue el nombre de archivo como group.xml se cambió en la ofuscación incorrecta del archivo de clase. Después de mirar la clase descompilada, me di cuenta de eso. Por lo tanto, primero compruebe si el nombre de archivo referido es correcto y está disponible en classpath.

0

Tuve el mismo problema. que añade siguientes atributos para <xs:schema..> elementFormDefault = attributeFormDefault "calificado" = "sin reservas"

<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 volverán a generar clases Java por xjc corriendo, que corrige package-info.java.

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

Esto me solucionó el problema.

Cuestiones relacionadas