unmarshal parse online marshal jaxbunmarshaller jaxbcontext example bean java xml jaxb unmarshalling

parse - javax.xml.bind.UnmarshalException: elemento inesperado(uri: ""



unmarshalling xml to java using jaxb example (4)

Recibo una excepción al convertir una respuesta XML de un servicio a un POJO. El XML se ve así:

Aquí está mi respuesta XML .

javax.xml.bind.UnmarshalException: unexpected element (uri:"" , local:"ItemSearchResponse"). Expected elements are <{http://webservices.amazon.com/AWSECommerceService/2011-08-01}ItemSearchResponse>

Lo estoy usando así:

Document response = getResponse(url); JAXBContext context = JAXBContext.newInstance(AmazonItem.class); Unmarshaller unMarshaller = context.createUnmarshaller(); newItem = (AmazonItem) unMarshaller.unmarshal(response);

Debajo están los detalles de mis archivos

package-info.java

@XmlSchema( namespace = "http://webservices.amazon.com/AWSECommerceService/2011-08-01", elementFormDefault = XmlNsForm.QUALIFIED) package com.services.amazon; import javax.xml.bind.annotation.XmlNsForm; import javax.xml.bind.annotation.XmlSchema;

AmazonItem.java

@XmlRootElement(name="ItemSearchResponse") @XmlAccessorType(XmlAccessType.FIELD) public class AmazonItem { @XmlElement(name="Items") private Items items = null; }

Items.java

@XmlAccessorType(XmlAccessType.FIELD) public class Items { @XmlElement(name="Item") List<Item> items = new ArrayList(); }

Item.java

@XmlAccessorType(XmlAccessType.FIELD) public class Item { @XmlElement(name="ASIN") private String asin; @XmlElement(name="ItemAttributes") private ItemAttributes attributes; @XmlElement(name="ItemLinks") private List<ItemLinks> itemLinks; }

ItemAttributes.java

@XmlAccessorType(XmlAccessType.FIELD) public class ItemAttributes { @XmlElement(name="Title") private String title; @XmlElement(name="Actor") private List<String> actor; @XmlElement(name="ProductGroup") private String productGroup; }

ItemLink.java

@XmlAccessorType(XmlAccessType.FIELD) public class ItemLink { @XmlElement(name="Description") private String description; @XmlElement(name="URL") private String url; }

ItemLinks.java

@XmlAccessorType(XmlAccessType.FIELD) public class ItemLinks { @XmlElement(name="ItemLink") List<ItemLink> itemLinks; }


El mensaje de error indica que está obteniendo un documento XML que se ve así:

<ItemSearchResponse>

En lugar de uno como el siguiente que coincida con la calificación del espacio de nombres que ha mapeado:

<ItemSearchResponse xmlns="http://webservices.amazon.com/AWSECommerceService/2011-08-01">


La explicación está aquí : la instancia de JAXBContext se inicializa con clases pasadas como parámetros y clases que son estáticamente alcanzables desde estas clases.

Inicialice JAXBContext utilizando el paquete, para que pueda ver @XmlSchema declarado en @XmlSchema :

JAXBContext.newInstance("com.services.amazon")


Si está utilizando DocumentBuilderFactory en su método getResponse, intente configurar el conocimiento del espacio de nombres:

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); factory.setNamespaceAware(true);

Tuve la misma excepción de Unmarshal y esto lo resolvió.


Elimine el espacio de nombres de package-info.java y cambie

elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED

a

elementFormDefault = javax.xml.bind.annotation.XmlNsForm.UNQUALIFIED.