2014-03-12 7 views
6

ich eine Ausnahme bin immer während eine XML-Antwort von einem Dienst zu einem POJO Drehen Die XML sieht wie folgt aus:javax.xml.bind.UnmarshalException: unerwartetes Element (uri: „“

Hier mein XML response ist.

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

ich es so bin mit:

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

Im Folgenden sind die Details meiner Dateien

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

Antwort

6

Die Fehlermeldung sagt, dass Sie ein XML-Dokument erhalten, die wie folgt aussieht:

<ItemSearchResponse> 

Statt eines wie die folgenden, die die Namespace-Qualifikationsspiele, die Sie zugeordnet haben:

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

hmmm aber mein xml hat einen Namespace Qualifikation ändern ... wie ich geschrieben. aber du hast Recht, wenn ich den Namespace aus 'package-info.java' entferne, dann funktioniert es gut. – Ethan

+0

@Ethan - Ist der URL-Parameter in deinem Code wirklich auf https://gist.githubusercontent.com/Omnipresent/9513522/raw/30ee8d73dac96579f0f9a0f4f67ebb52aec26a42/response.xml oder auf etwas anderes eingestellt? –

4

Die Erklärung ist here: Die JAXBContext-Instanz wird initialisiert mit Klasse (n) als Parameter (n) und Klassen, die statisch von diesen Klassen erreichbar sind.

initialisieren JAXBContext mit Paket, so kann es @XmlSchema in package-info.java erklärt sehen:

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

Es ist nicht erforderlich, den 'JAXBContext' für den Paketnamen zu starten, um die' @ XmlSchema' Annotation zu erhalten. Momentan erwartet der JAXB gemäß der Fehlermeldung den Namespace, es scheint der XML zu sein, der ihn vermisst. –

+1

Kann sein, dann sollte der Autor die Eingabe überprüfen, die, die er zur Verfügung gestellt hat, hat Namespace – hoaz

1

Wenn Sie Document in Ihrem getResponse Methode verwenden, versuchen Namespace Bewusstsein Einstellung:

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

Ich hatte die gleiche UnmarshalException und das löste es.

0

den Namespace von package-info.java entfernen und

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

zu

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