代码之家  ›  专栏  ›  技术社区  ›  Matt Solnit

使用JAXB解组列表

  •  5
  • Matt Solnit  · 技术社区  · 14 年前

    我知道这是一个初学者的问题,但我已经用头撞墙两个小时了,现在我正在努力解决这个问题。

    我已经从一个REST服务(Windows Azure管理API)返回了XML,它如下所示:

    <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(微软不提供)。这是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;
      }
    
    }
    

    如有任何帮助,我们将不胜感激。

    1 回复  |  直到 14 年前
        1
  •  5
  •   axtavt    14 年前

    @XmlRootElement namespace 不会传播到其子代。应显式指定命名空间:

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