所以,让我说我有这个带有几个名称空间的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(){...}
由于某种原因,我无法获得产品编号。我一直收到请求错误。我正确处理名称空间,还是我错过了什么?
答案 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"
。不需要前缀。
对于Product
和Instance
的名称空间似乎是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(){...}
}