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

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

Encontre uma exceção ao desempacotar do xml

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

A classe de grupo não tem nenhuma anotação e group.xml contém apenas dados.

Qualquer coisa pode ser a causa?

usuário496949
fonte
4
Para aqueles que vêm aqui de uma pesquisa, só quero comentar que isso pode ser causado pelo uso ObjectFactoryde fontes incorretas de fontes geradas, o que é mais provável se você estiver misturando dois diretórios de fontes geradas diferentes.
bbarker

Respostas:

119

Parece que seu documento XML tem o elemento raiz "Grupo" em vez de "grupo". Você pode:

  1. Altere o elemento raiz em seu XML para "grupo"
  2. Adicione a anotação @XmlRootElement (name = "Group") às classes de grupo.
bdoughan
fonte
2
Resolveu o problema, obrigado! Usei a segunda solução, @XmlRootElement (name = "Group"). Meu nome de classe é Grupo e o elemento raiz XML é Grupo, por que ainda preciso de name = "Grupo"
usuário496949
2
@BlaiseDoughan Estou tendo o problema exatamente oposto, @XmlRootElement(name = "MB") @XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "MB", propOrder = { "date", "time" })mas estou percebendo que unexpected element (uri:"http://xx.title.com/new/response", local:"MB"). Expected elements are <{}Date>,<{}MB>,<{}Time>também tenho @XmlElement(name="Date", required = true)em cada campo. Onde e por que está dando errado? Eu também tentei remover @XmlRootElement!
Rahul Thakur
4
Ocorreu um problema com o @XmlSchemain package-info.java, corrigido agora.
Rahul Thakur
35

Você precisa colocar package-info.java no pacote jaxb gerado. Seu conteúdo deve ser algo assim

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

Felizmente, a classe de informações do pacote não é necessária. Consegui consertar o meu problema com a solução iowatiger08.

Aqui está minha correção, mostrando a mensagem de erro para ajudar a juntar os pontos para alguns.

Mensagem de erro

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

Código antes da correção

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

Código após correção

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

Você pode ver o namespace adicionado a @XmlRootElement conforme indicado na mensagem de erro.

Glenn Mason
fonte
Enfrentou o mesmo problema e seguiu seu comentário e o problema está resolvido. Obrigado.
Bibin Zacharias
9

Depois de examinar mais, o elemento raiz deve ser associado a um namespace de esquema, como Blaise está observando. Ainda, eu não tinha um java com informações de pacote. Portanto, sem usar a anotação @XMLSchema, consegui corrigir esse problema usando

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

Espero que isto ajude!

iowatiger08
fonte
adicionar um namespace a um elemento raiz é demais! :-)
Konstantin Ivanov
5

Esta é uma correção para um caso de uso de nicho muito bonito, mas sempre me incomoda. Se você estiver usando o gerador Eclipse Jaxb, ele cria um arquivo chamado package-info.

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

Se você excluir este arquivo, um xml mais genérico será analisado. De uma chance!

marcar thegrea
fonte
1
Acordou perfeito depois disso .. Muito obrigado amigo .. :). Acabei de fazer o namespace mencionado para uma string vazia.
Arundev
2

Eu tive o mesmo problema .. Isso me ajudou, eu estou especificando os mesmos nomes de campo de minhas classes como os nomes de tag no arquivo xml (o arquivo vem de um sistema externo).

Por exemplo:

Meu arquivo 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>

Minha classe de resposta:

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

Minha classe 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
}

Minha classe de item:

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

Minha classe RegionList:

@XmlRootElement(name="RegionList")
@XmlAccessorType(XmlAccessType.FIELD)
public class RegionList {
    Item[] Item = new Item[1];

    // getters and setters here
}

Minha classe 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();
        }
    }
}

Dá:

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

fonte
1

Você precisa colocar a package-info.javaclasse no pacote de contextPath e colocar o código abaixo na mesma classe:

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

O mesmo para mim. O nome da classe de mapeamento era, Mbeanmas o nome da raiz da tag era, mbeanentão eu tive que adicionar a anotação:

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

Eu tive o mesmo problema. Eu adicionei os seguintes atributos a <xs:schema..> elementFormDefault = "qualificado" attributeFormDefault = "não qualificado"

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

e regenerou classes java executando xjc, que corrigiu o package-info.java.

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

Isso resolveu o problema para mim.

Rashmi
fonte
0

Já estou com o mesmo problema e apenas altero conforme abaixo:

@XmlRootElement -> @XmlRootElement(name="Group")
Rabieh Eid
fonte
0

Eu tive o mesmo problema, meu problema era que eu tinha dois webservices diferentes com dois arquivos wsdl diferentes. Eu gerei os fontes no mesmo pacote para ambos os serviços da web, o que parece ser um problema. Acho que é por causa da ObjectFactory e talvez também por causa do package-info.java - porque eles são gerados apenas uma vez.

Eu resolvi isso, gerando as fontes para cada serviço da web em um pacote diferente. Dessa forma, você também tem dois ObjectFactories e arquivos package-info.java diferentes.

Sepultura
fonte
0

Caso você esteja enlouquecendo porque isso acontece apenas em seus testes e você está usando PowerMock esta é a solução, adicione-o no topo de sua classe de teste:

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

Nenhuma das soluções mencionadas aqui funcionou para mim, eu ainda estava recebendo:

Exceção no thread "principal" javax.xml.bind.UnmarshalException: elemento inesperado (uri: "java: XXX.XX.XX.XXX", local: "XXXXX")

Depois de muita pesquisa em outros sites, o código abaixo funcionou para mim-

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
fonte
-1

Se nenhuma das opções acima funcionar, tente adicionar

@XmlRootElement(name="Group") para as aulas do Grupo.

FOO
fonte