2010-02-11 20 views
5

Ich weiß, dass dies eine Anfängerfrage ist, aber ich habe zwei Stunden lang meinen Kopf gegen eine Wand geschlagen, um das herauszufinden.Unmarshalling einer Liste mit JAXB

Ich habe XML bekam auf dem Rückweg von einem REST-Dienst (Windows Azure Management API), die wie folgt aussieht:

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

Als ich un-Marschall versuchen Sie es JAXB verwenden, die Liste der Dienste ist immer leer.

Ich möchte vermeiden, eine XSD schreiben, wenn möglich (Microsoft bietet keine). Hier ist der JAXB Code:

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()); 

Und hier sind die Java-Klassen:

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

} 

Jede Hilfe wäre sehr zu begrüßen.

Antwort

5

@XmlRootElementnamespace wird nicht an seine untergeordneten Elemente weitergegeben. Sie sollten den Namespace explizit angeben:

... 
@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

Vielen Dank! Das hat das Problem behoben. Aber ist das wirklich Standard? Die verschiedenen JAXB-Samples, die ich online gesehen habe, scheinen den Namespace nie zu enthalten. –

+3

Es gibt auch eine '@ XmlSchema' Annotation auf Paketebene. Es gibt den Standardnamespace für alle Klassen im Paket an. – axtavt

Verwandte Themen