2010-02-11 21 views
5

Sé que esta es una pregunta para principiantes, pero he estado golpeando mi cabeza contra la pared durante dos horas tratando de resolver esto.Desactivar una lista usando JAXB

Tengo XML volver de un servicio REST (administración de Windows Azure API) que tiene el siguiente aspecto:

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

Cuando trato de no-Mariscal usando JAXB, la lista de servicios es siempre vacio

Me gustaría evitar escribir un XSD si es posible (Microsoft no proporciona uno). Aquí está el código 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()); 

Y aquí están las clases de 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; 
    } 

} 

sería apreciada sinceramente Cualquier ayuda.

Respuesta

5

@XmlRootElementnamespace no se propaga a sus hijos. Debe especificar explícitamente el espacio de nombres:

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

¡Gracias! Eso solucionó el problema. ¿Pero esta es realmente la práctica estándar? Las diversas muestras de JAXB que he visto en línea nunca parecen incluir el espacio de nombres. –

+3

También hay una anotación a nivel de paquete '@ XmlSchema'. Especifica el espacio de nombres predeterminado para todas las clases en el paquete. – axtavt

Cuestiones relacionadas