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:
- Cambie el elemento raíz en su XML para que sea "grupo"
- 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