我有一个名为 Employee 的根类,它有两个元素 empid 和 name 以及另一个名为 Address的jaxb类。以下是示例代码段。
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "Request",propOrder = {
"header",
"body",
"signature"
})
@XmlRootElement(name="Employee")
public class Employee
implements Serializable
{
@XmlElement(name = "Header", required = true)
protected String empId;
@XmlElement(name = "Body", required = true)
protected String empName;
@XmlElement(name = "Address", required = true)
protected Address address;
.. setters and getters
}
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "Address", propOrder = {
"streetLine1",
"streetLine2",
})
@XmlRootElement(name="Address",namespace= "http://www.w3.org/2000/09/xmldsig#")
public class Employee
implements Serializable
{
private final static long serialVersionUID = 100L;
@XmlElement(name = "addressLine1", required = true)
protected String addressLine1;
@XmlElement(name = "addressLine2", required = true)
protected String addressLine2;
//Setters and getters
}
现在,当我使用jaxb编组生成XML字符串时,我想要预期的结果如下:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Employee xmlns="http://www.test.com">
<empId>124</empId>
<empName>name</empName>
<Address xmlns:ns2="http://www.w3.org/2000/09/xmldsig#">
<ns2:streetLine1 Id="line1"/>
<ns2:streetLine2 Id="Line2"/>
</Address>
</Request>
请建议。在此先感谢。
答案 0 :(得分:0)
您的JAXB类存在一些问题,我认为您已复制粘贴并错误地更改了某些名称。 @XMLType
中的以下元素必须定义为@XMLElement
。
@XmlType(name = "Request",propOrder = {
"header",
"body",
"signature"
})
无论如何假设课程是对的。您需要进行2次更改才能生成具有不同命名空间中引用的元素的XML。
@XMLSchema
将命名空间移动到包级别。即在包级别添加package-info.java以指定名称空间。Address
类中为Employee
元素提供自己的命名空间。如果不在父命名空间中,则必须在此级别覆盖每个元素。<强> package-info.java 强>
@XmlSchema(
namespace = "http://www.test.com",
elementFormDefault = XmlNsForm.QUALIFIED)
package int1.d;
import javax.xml.bind.annotation.*;
<强> Employee.java 强>
package int1.d;
import java.io.Serializable;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "Request",propOrder = {
"header",
"body",
"signature"
})
@XmlRootElement(name="Employee")
public class Employee
implements Serializable
{
private static final long serialVersionUID = 8293193254658211943L;
@XmlElement(name = "Header", required = true)
protected String empId;
@XmlElement(name = "Body", required = true)
protected String empName;
@XmlElement(name = "Address", namespace="http://www.w3.org/2000/09/xmldsig#", required = true )
protected Address address;
public String getEmpId() {
return empId;
}
public void setEmpId(String empId) {
this.empId = empId;
}
public String getEmpName() {
return empName;
}
public void setEmpName(String empName) {
this.empName = empName;
}
public Address getAddress() {
return address;
}
public void setAddress(Address address) {
this.address = address;
}
}
<强> package-info.java 强>
@XmlSchema(
namespace = "http://www.w3.org/2000/09/xmldsig#",
elementFormDefault=XmlNsForm.QUALIFIED )
package int1.d2;
import javax.xml.bind.annotation.*;
<强> Address.java 强>
package int1.d2;
import java.io.Serializable;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "Address", propOrder = {
"streetLine1",
"streetLine2",
})
@XmlRootElement(name="Address")
public class Address
implements Serializable
{
private final static long serialVersionUID = 100L;
@XmlElement(name = "addressLine1", required = true)
protected String addressLine1;
@XmlElement(name = "addressLine2", required = true)
protected String addressLine2;
public String getAddressLine1() {
return addressLine1;
}
public void setAddressLine1(String addressLine1) {
this.addressLine1 = addressLine1;
}
public String getAddressLine2() {
return addressLine2;
}
public void setAddressLine2(String addressLine2) {
this.addressLine2 = addressLine2;
}
}
由JAXB生成的输出
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Employee xmlns="http://www.test.com" xmlns:ns2="http://www.w3.org/2000/09/xmldsig#">
<Header>124</Header>
<Body>bae</Body>
<ns2:Address>
<ns2:addressLine1>line1</ns2:addressLine1>
<ns2:addressLine2>line2</ns2:addressLine2>
</ns2:Address>
</Employee>