1

我正在使用 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>

如您所见,命名空间已应用于顶级元素而不是FailedItemsandSucceededItems元素。我不明白为什么会这样。此外,如您所见,我在顶级元素上没有http://www.w3.org/2001/XMLSchema-instanceunexpected element (uri:"", local:"ResultCollection"). Expected elements are <{http://www.w3.org/2001/XMLSchema-instance}ResultCollection>命名空间,因为如果有,解组失败并出现异常。这个错误消息让我更加困惑,因为响应 XML 清楚地表明了命名空间。

我通常不使用 Java 和 XML 名称空间,这是我一直试图忽略的东西。任何帮助,将不胜感激。

4

2 回答 2

1

IMO 您可以使用 xjc 工具从 XML 模式自动生成 Java 类。与手动创建类相比,它们可以更好地使用 XML 模式。Xjc 是 JDK 的一部分。

于 2013-07-11T20:24:14.967 回答
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;
}
于 2013-07-11T20:26:19.373 回答