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

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

Conozca una excepción al desagrupar 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?

user496949
fuente
4
Para aquellos que vienen aquí desde una búsqueda, solo quiero comentar que esto puede deberse al uso ObjectFactoryde fuentes incorrectas de fuentes generadas, lo cual es más probable si está mezclando dos directorios de fuentes generados diferentes.
bbarker

Respuestas:

119

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 (nombre = "Grupo") a las clases de Grupo.
bdoughan
fuente
2
Resolvió el problema, ¡Gracias! Usé la segunda solución, @XmlRootElement (name = "Group"). Mi nombre de clase es Grupo y el elemento raíz XML es Grupo, por qué todavía necesito name = "Grupo"
user496949
1
Echa un vistazo a: stackoverflow.com/questions/5203531/…
bdoughan
2
@BlaiseDoughan Tengo el problema exactamente opuesto, @XmlRootElement(name = "MB") @XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "MB", propOrder = { "date", "time" })pero unexpected element (uri:"http://xx.title.com/new/response", local:"MB"). Expected elements are <{}Date>,<{}MB>,<{}Time>también tengo @XmlElement(name="Date", required = true)en cada campo. ¿Dónde y por qué va mal? ¡También intenté eliminar @XmlRootElement!
Rahul Thakur
4
Hubo un problema con @XmlSchemain package-info.java, solucionado ahora.
Rahul Thakur
35

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

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

Afortunadamente, la clase de información del paquete no es necesaria. Pude solucionar el problema mío 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 arreglar

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

Código tras corrección

@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.

Glenn Mason
fuente
Enfrentó el mismo problema y siguió su comentario y el problema se resuelve. Gracias.
Bibin Zacharias
9

Después de buscar más, el elemento raíz debe asociarse con un espacio de nombres de esquema, como señala Blaise. 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!

iowatiger08
fuente
agregar un espacio de nombres a un elemento raíz ¡rocas! :-)
Konstantin Ivanov
5

Esta es una solución para un caso de uso bastante especializado, 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!

markthegrea
fuente
1
Funcionó perfecto después de eso .. Muchas gracias amigo .. :). Acabo de hacer que el espacio de nombres mencionado sea una cadena vacía.
Arundev
2

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 de 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

fuente
1

Debe poner la package-info.javaclase en el paquete de contextPath y poner el código debajo en la misma clase:

@javax.xml.bind.annotation.XmlSchema(namespace = "https://www.namespaceUrl.com/xml/", elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED)
package com.test.valueobject;
ankit
fuente
0

Lo mismo para mi. El nombre de la clase de mapeo era, Mbeanpero el nombre de la raíz de la etiqueta era, mbeanasí que tuve que agregar la anotación:

@XmlRootElement(name="mbean")
public class MBean { ... }
Laura Liparulo
fuente
0

Tuve el mismo problema. Agregué los siguientes atributos a <xs:schema..> elementFormDefault = "calificado" 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 clases java regeneradas 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í.

Rashmi
fuente
0

Ya tengo el mismo problema y simplemente lo cambio como se muestra a continuación:

@XmlRootElement -> @XmlRootElement(name="Group")
rabieh eid
fuente
0

Tuve el mismo problema, mi problema era que tenía dos servicios web diferentes con dos archivos wsdl diferentes. Genere las fuentes en el mismo paquete para ambos servicios web, lo que parece ser un problema. Supongo que se debe a ObjectFactory y quizás también a package-info.java, porque solo se generan una vez.

Lo resolví generando las fuentes para cada servicio web en un paquete diferente. De esta manera, también tiene dos ObjectFactories diferentes y archivos package-info.java.

Sepultura
fuente
0

En caso de que se esté volviendo loco porque esto sucede solo en sus Pruebas y está usando PowerMock, esta es la solución, agréguela en la parte superior de su clase de prueba:

@PowerMockIgnore({ "javax.xml.*", "org.xml.*", "org.w3c.*" })
Massimo
fuente
0

Ninguna de las soluciones mencionadas aquí funcionó para mí, todavía estaba obteniendo:

Excepción en el hilo "principal" javax.xml.bind.UnmarshalException: elemento inesperado (uri: "java: XXX.XX.XX.XXX", local: "XXXXX")

Después de mucha investigación a través de otros sitios, el código a continuación funcionó para mí:

FileInputStream fis = new FileInputStream("D:/group.xml");
SOAPMessage message = factory.createMessage(new MimeHeaders(), fis);
JAXBContext jc = JAXBContext.newInstance(Group.class);
Unmarshaller u = jc.createUnmarshaller();
JAXBElement<Group> r = u.unmarshal(message.getSOAPBody().extractContentAsDocument(), Group.class);
Group group = r.getValue();
Xavi
fuente
-1

Si nada de lo anterior funciona, intente agregar

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

FOO
fuente