使用多个名称空间解组

时间:2013-02-01 17:37:11

标签: java rest jaxb jersey

所以,让我说我有这个带有几个名称空间的xml。

<Envelope xmlns:pdi="http://www.mypage.com/schemas/pdi" xmlns:ib="http://www.mypage.com/schemas/ib" xmlns="http://www.mypage.com/schemas/envelope">
  <Product>
    <pdi:number>123456</pdi:number>
  </Product>
  <Instance>
    <ib:serial>abcdefg</ib:serial>
  </Instance>
</Envelope>

我正在尝试为它构建一个客户端。我有一个像这样声明的信封POJO

@XmlRootElement(name ="Envelope", namespace = "http://www.mypage.com/schemas/envelope")
public class Envelope

和内部,它具有这些属性

@XmlElement(name="Product", namespace = "http://www.mypage.com/schemas/pdi")
public Product getProduct(){...}

@XmlElement(name="Instance", namespace = "http://www.mypage.com/schemas/ib")
public Instance getInstance(){...}

此外,产品POJO如下所示:

@XmlRootElement(name="Product", namespace = "http://www.mypage.com/schemas/pdi")
public class Product

和属性

@XmlElement(name="pdi:number", namespace = "http://www.mypage.com/schemas/pdi")
public int getNumber(){...}

由于某种原因,我无法获得产品编号。我一直收到请求错误。我正确处理名称空间,还是我错过了什么?

2 个答案:

答案 0 :(得分:6)

对于这个用例,我建议利用包级别@XmlSchema注释来指定命名空间限定。

package-info(forum14651918 / package-info.java)

@XmlSchema(
    namespace="http://www.mypage.com/schemas/envelope", 
    elementFormDefault=XmlNsForm.QUALIFIED,
    xmlns={
            @XmlNs(namespaceURI = "http://www.mypage.com/schemas/envelope", prefix = ""),
            @XmlNs(namespaceURI = "http://www.mypage.com/schemas/ib", prefix = "ib"),
            @XmlNs(namespaceURI = "http://www.mypage.com/schemas/pdi", prefix = "pdi")
    }
)
@XmlAccessorType(XmlAccessType.FIELD)
package forum14651918;

import javax.xml.bind.annotation.*;

信封(forum14651918 / Envelope.java)

由于我们在namespace注释中指定了elementFormDefault@XmlSchema,因此Envelope类对应的所有元素都将自动通过{{1}限定} namespace。

http://www.mypage.com/schemas/envelope

产品(forum14651918 / Product.java)

您可以使用package forum14651918; import javax.xml.bind.annotation.*; @XmlRootElement(name="Envelope") public class Envelope { @XmlElement(name="Product") private Product product; @XmlElement(name="Instance") private Instance instance; } 注释覆盖Product类的命名空间。

@XmlType

实例(forum14651918 / Instance.java)

您可以使用package forum14651918; import javax.xml.bind.annotation.*; @XmlType(namespace="http://www.mypage.com/schemas/pdi") public class Product { private int number; } 注释覆盖Instance类的命名空间。

@XmlType

演示(forum14651918 / Demo.java)

以下是您可以运行的一些代码,以证明一切正常。

package forum14651918;

import javax.xml.bind.annotation.XmlType;

@XmlType(namespace="http://www.mypage.com/schemas/ib")
public class Instance {

    private String serial;

}

了解更多信息

答案 1 :(得分:1)

尝试将name="pdi:number", namespace = "http://www.mypage.com/schemas/pdi"替换为name="number", namespace = "http://www.mypage.com/schemas/pdi"。不需要前缀。

对于ProductInstance的名称空间似乎是http://www.mypage.com/schemas/envelope,我们更关注XML。

@XmlRootElement课程不需要Product注释。它不是根元素,已在getProduct()上配置。

应该没问题的完整配置是:

@XmlRootElement(name ="Envelope", namespace = "http://www.mypage.com/schemas/envelope")
public class Envelope {


   @XmlElement(name="Product", namespace = "http://www.mypage.com/schemas/envelope")
   public Product getProduct(){...}

   @XmlElement(name="Instance", namespace = "http://www.mypage.com/schemas/envelope")
   public Instance getInstance(){...}

}
public class Product {

    @XmlElement(name="number", namespace = "http://www.mypage.com/schemas/pdi")
    public int getNumber(){...}
}

public class Instance {

    @XmlElement(name="serial", namespace = "http://www.mypage.com/schemas/ib")
    public String getSerial(){...}
}