2010-02-11 48 views
5

我知道這是一個初學者問題,但我一直試圖解決這個問題,一直在困擾我的頭撞牆。使用JAXB解組一個列表

我有XML從REST服務(Windows Azure管理API),它看起來像下面回來:

<HostedServices 
    xmlns="http://schemas.microsoft.com/windowsazure" 
    xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> 
    <HostedService> 
    <Url>https://management.core.windows.net/XXXXX</Url> 
    <ServiceName>foo</ServiceName> 
    </HostedService> 
    <HostedService> 
    <Url>https://management.core.windows.net/XXXXX</Url> 
    <ServiceName>bar</ServiceName> 
    </HostedService> 
</HostedServices> 

當我嘗試取消元帥使用JAXB它,服務的列表總是空的。

我想盡可能避免編寫XSD(Microsoft不提供)。下面是JAXB代碼:

JAXBContext context = JAXBContext.newInstance(HostedServices.class, HostedService.class); 
    Unmarshaller unmarshaller = context.createUnmarshaller(); 
    HostedServices hostedServices = (HostedServices)unmarshaller.unmarshal(new StringReader(responseXML)); 

    // This is always 0: 
    System.out.println(hostedServices.getHostedServices().size()); 

這裏是Java類:

@XmlRootElement(name="HostedServices", namespace="http://schemas.microsoft.com/windowsazure") 
public class HostedServices 
{ 
    private List<HostedService> m_hostedServices = new ArrayList<HostedService>(); 

    @XmlElement(name="HostedService") 
    public List<HostedService> getHostedServices() 
    { 
    return m_hostedServices; 
    } 

    public void setHostedServices(List<HostedService> services) 
    { 
    m_hostedServices = services; 
    } 
} 

@XmlType 
public class HostedService 
{ 
    private String m_url; 
    private String m_name; 

    @XmlElement(name="Url") 
    public String getUrl() 
    { 
    return m_url; 
    } 

    public void setUrl(String url) 
    { 
    m_url = url; 
    } 

    @XmlElement(name="ServiceName") 
    public String getServiceName() 
    { 
    return m_name; 
    } 

    public void setServiceName(String name) 
    { 
    m_name = name; 
    } 

} 

任何幫助將衷心感謝。

回答

5

@XmlRootElementnamespace不傳播給它的孩子。您應該明確指定名稱空間:

... 
@XmlElement(name="HostedService", namespace="http://schemas.microsoft.com/windowsazure") 
... 
@XmlElement(name="Url", namespace="http://schemas.microsoft.com/windowsazure") 
... 
@XmlElement(name="ServiceName", namespace="http://schemas.microsoft.com/windowsazure") 
... 
+0

謝謝!這解決了問題。但這真的是標準做法嗎?我在網上看到的各種JAXB示例似乎沒有包含名稱空間。 – 2010-02-11 19:39:19

+3

還有一個'@ XmlSchema'包級別註釋。它爲包中的所有類指定默認名稱空間。 – axtavt 2010-02-11 19:56:22