我正在使用JAXB对我正在为其实现Java客户端的Web服务的请求和响应进行编组和解组。然而,我仍然坚持我需要解组的以下响应。
<ResultCollection xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<FailedItems xmlns:a="http://schemas.microsoft.com/2003/10/Serialization/Arrays">
<a:KeyValueOflongstring>
<a:Key>12345</a:Key>
<a:Value>Some clever message here</a:Value>
</a:KeyValueOflongstring>
</FailedItems>
<SucceededItems xmlns:a="http://schemas.microsoft.com/2003/10/Serialization/Arrays"/>
</ResultCollection>
要将响应表示为Java对象,我有以下域类:
@XmlRootElement(name="ResultCollection")
public class ResultCollectionResponse
{
@XmlElementWrapper(name="FailedItems", namespace="http://schemas.microsoft.com/2003/10/Serialization/Arrays")
@XmlElement(name = "KeyValueOflongstring")
public List<KeyValueOflongstring> FailedItems = new ArrayList<KeyValueOflongstring>();
@XmlElementWrapper(name="SucceededItems", namespace="http://schemas.microsoft.com/2003/10/Serialization/Arrays")
@XmlElement(name = "long")
public List<Long> SucceededItems = new ArrayList<Long>();
}
public class KeyValueOflongstring
{
public Long Key;
public String Value;
}
我正在做以下的解组:
JAXBContext jc = JAXBContext.newInstance(ResultCollectionResponse.class);
Unmarshaller u = jc.createUnmarshaller();
// inputStream holds the XML content from the web service
ResultCollectionResponse response = (ResultCollectionResponse)u.unmarshal(inputStream);
解密没有发生事故。使用两个列表创建ResultCollectionResponse
对象。 SucceededItems
为空,FailedItems
有一个项目。但是,该项目上的Key
和Value
为空。我认为这与XML命名空间有关,但我不能为我的生活弄清楚如何修复它。
我尝试过另一种方式,可以通过在Java代码中创建虚拟对象并将它们编组为XML来实现。当我这样做时,我最终得到以下XML:
<ResultCollection xmlns:ns2="http://schemas.microsoft.com/2003/10/Serialization/Arrays">
<FailedItems>
<ns2:KeyValueOflongstring>
<Key>12345678</Key>
<Value>Some clever message here</Value>
</ns2:KeyValueOflongstring>
</FailedItems>
<SucceededItems/>
</ResultCollection>
如您所见,命名空间已应用于顶级元素,而不是FailedItems
和SucceededItems
元素。我不明白为什么会这样。另外,正如您所看到的,我在顶级元素上没有http://www.w3.org/2001/XMLSchema-instance命名空间,因为如果我这样做,则解组失败并返回异常unexpected element (uri:"", local:"ResultCollection"). Expected elements are <{http://www.w3.org/2001/XMLSchema-instance}ResultCollection>
。此错误消息让我更加困惑,因为响应XML显然具有所述命名空间。
我通常不使用Java和XML命名空间是我一直试图忽略的东西。任何帮助将不胜感激。
答案 0 :(得分:1)
IMO您可以使用xjc工具自动从XML模式生成Java类。与手动创建类相比,它们更好地保证它们将使用XML模式。 Xjc是JDK的一部分。
答案 1 :(得分:1)
您可以执行以下操作。在您的示例中,具有前缀的元素是名称空间限定的元素,而不是包含名称空间声明的元素。
@XmlRootElement(name="ResultCollection")
public class ResultCollectionResponse
{
@XmlElementWrapper(name="FailedItems")
@XmlElement(name = "KeyValueOflongstring", namespace="http://schemas.microsoft.com/2003/10/Serialization/Arrays")
public List<KeyValueOflongstring> FailedItems = new ArrayList<KeyValueOflongstring>();
@XmlElementWrapper(name="SucceededItems")
@XmlElement(name = "long")
public List<Long> SucceededItems = new ArrayList<Long>();
}
public class KeyValueOflongstring
{
@XmlElement(namespace="http://schemas.microsoft.com/2003/10/Serialization/Arrays")
public Long Key;
@XmlElement(namespace="http://schemas.microsoft.com/2003/10/Serialization/Arrays")
public String Value;
}