当前位置: 首页 > 知识库问答 >
问题:

使用命名空间取消编组 XML 响应

洪宇定
2023-03-14

我正在使用 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 对象是使用两个列表创建的。成功项为空,失败项有一项。但是,该项目上的值为 null。我认为这与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>

如您所见,命名空间已应用于顶级元素,而不是 FailedItemsSuccessitems 元素。我不明白为什么会这样。另外,正如你所看到的,我在顶级元素上没有 http://www.w3.org/2001/XMLSchema-instance 命名空间,因为如果我这样做,取消编组会失败,并出现异常意外元素(uri:“”,local:“ResultCollection”)。预期元素是

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


共有2个答案

韦安怡
2023-03-14

在我看来,您可以使用xjc工具从XML模式自动生成Java类。与手动创建类相比,更好地保证它们将与XML模式一起工作。Xjc是JDK的一部分。

锺离珂
2023-03-14

您可以执行以下操作。在您的示例中,是带有前缀的元素被命名空间限定,而不是包含命名空间声明的元素。

@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;
}
 类似资料:
  • 我有一个XML要与JAXB解组。如果我从元素中删除所有名称空间属性,代码运行良好,但是如果我保留名称空间属性的话,在解组后会得到一个空对象。 XML是这样的: 我的动物豆是这样的: 猫豆就像: 在运行时,我得到一个空对象。我试图从属性中删除< code>"z:",得到了这个异常: 如果我从猫和动物中删除命名空间,我会得到这个例外: 下面是解组的最终代码。最后一行给出了一个空指针异常 我不确定如何处

  • 问题内容: 我正在使用JQuery执行Web服务调用,它是ajax函数,无法解析返回的数据。当我警告数据(alert($(data).find(“ return”)。text())为空时,我看到服务器响应xml数据,如下所示,当我警告(数据)时,我得到了[object XMLDocument给定我的XML结构并在下面使用命名空间,txt = $(data).find(“ return”)。text

  • 我需要你在JAXB编组方面的帮助。这是关于命名空间的。我在这个令人惊叹的网站上阅读了不同的博客和很多答案,但我还没有意识到如何解决我的问题。 我需要用一些复杂的(至少对我来说)名称空间生成一个XML。 如您所见,该XML具有 < code > xmlns:xsi = " http://www . w3 . org/2001/XML schema-instance " 和 http://www.sa

  • 主要内容:命名冲突,使用前缀来避免命名冲突,XML 命名空间 - xmlns 属性,统一资源标识符(URI,全称 Uniform Resource Identifier),默认的命名空间,实际使用中的命名空间XML 命名空间提供避免元素命名冲突的方法。 命名冲突 在 XML 中,元素名称是由开发者定义的,当两个不同的文档使用相同的元素名时,就会发生命名冲突。 这个 XML 携带 HTML 表格的信息: <table> <tr> <td>Apples</td> <td>Bananas</td> <

  • 这是我的xml,需要把它转换成Java。我使用了jaxb 并抛出以下异常javax.xml.bind.unmarshalException:意外元素(URI:“http://www.ae.com/event/load”,local:“order”)。需要的元素为<{}LM:order>

  • 我试图使用jaxb解组一个soap响应。 我尝试使用以下代码查找根元素 这是我的样本回复 我能够获取对象,但当我尝试访问中的时,由于前缀 有人能帮我脱身吗? 更新:有人能帮我吗? 我使用stax xml解析器解析为,但我将其中的所有值都视为null。