2014-03-12 1740 views
6

我得到一個異常而轉向從一個POJO服務的XML響應的XML看起來是這樣的:javax.xml.bind.UnmarshalException:意外的元素(URI:「」

這是我XML response

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

我使用它是這樣的:

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

下面是我的文件細節

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

回答

6

錯誤消息是說,你得到的是看起來像這樣的XML文檔:

<ItemSearchResponse> 

,而不是一個像你已經映射的名稱空間的資格符合以下情況:

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

嗯,但我的XML確實有一個命名空間的資格......我貼。但是你是對的,如果我從'package-info.java'中刪除命名空間,那麼它工作正常。 – Ethan

+0

@Ethan - 你的代碼中的url參數是否真的設置爲https://gist.githubusercontent.com/Omnipresent/9513522/raw/30ee8d73dac96579f0f9a0f4f67ebb52aec26a42/response.xml還是別的? –

4

的解釋是here: JAXBContext實例初始化爲類(es)作爲參數傳遞,並且這些類可以從這些類靜態訪問。使用包

初始化JAXBContext,所以可以看到在package-info.java宣佈@XmlSchema

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

它不需要引導包名稱上的'JAXBContext'來獲得'@ XmlSchema'註釋。目前根據JAXB期望的命名空間的錯誤消息,它看起來是缺少它的XML。 –

+1

可以,那麼作者應該檢查輸入,他提供的名稱空間 – hoaz

1

如果你在你的GETRESPONSE方法使用的DocumentBuilderFactory,嘗試設置命名空間的認識:

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

我有相同的UnmarshalException,這解決了它。

0

package-info.java刪除的命名空間,改變

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

elementFormDefault = javax.xml.bind.annotation.XmlNsForm.UNQUALIFIED. 
相關問題