2010-02-11 4 views
5

나는 이것이 초보자 용 질문이라는 것을 알고있다. 그러나 나는 이것을 알아 내려고 2 시간 동안 벽에 머리를 두드렸다.JAXB를 사용하여 목록을 비 정렬 화하기

내가있어 XML 지내는 서비스 기능은 다음과 같습니다 (윈도우 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에서는 XSD를 제공하지 않습니다).

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

그리고 여기에 자바 클래스입니다 : 어떤 도움을 진심으로 감사하겠습니다

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

} 

다음은 JAXB 코드입니다.

답변

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 샘플은 네임 스페이스를 포함하지 않는 것 같습니다. –

+3

'@XmlSchema' 패키지 레벨 주석도 있습니다. 패키지의 모든 클래스에 대한 기본 네임 스페이스를 지정합니다. – axtavt

관련 문제