我知道这是一个初学者问题,但我已经用头撞墙两个小时了,现在试图弄清楚这一点。
我从 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;
}
}
任何帮助将不胜感激。
最佳答案
@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")
...
关于java - 使用 JAXB 解码列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2246935/