【问题标题】:Unmarshalling a list using JAXB使用 JAXB 解组列表
【发布时间】:2011-01-15 20:36:16
【问题描述】:

我知道这是一个初学者的问题,但我已经用头撞墙了两个小时,试图弄清楚这一点。

我从 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(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;
  }

}

任何帮助将不胜感激。

【问题讨论】:

    标签: java list jaxb azure


    【解决方案1】:

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

    【讨论】:

    • 谢谢!这解决了问题。但这真的是标准做法吗?我在网上看到的各种 JAXB 示例似乎从未包含命名空间。
    • 还有一个@XmlSchema包级注解。它为包中的所有类指定默认命名空间。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-31
    • 1970-01-01
    相关资源
    最近更新 更多