使用根类为javajaxbbean创建xml字符串&;具有不同名称空间的内部类

使用根类为javajaxbbean创建xml字符串&;具有不同名称空间的内部类,jaxb,javabeans,xml-namespaces,Jaxb,Javabeans,Xml Namespaces,我有一个名为Employee的根类,它有两个元素empid和name,还有一个名为Address的jaxb类。下面是示例代码段 @XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "Request",propOrder = { "header", "body", "signature" }) @XmlRootElement(name="Employee") public class Employee impl

我有一个名为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>

124
名称

请建议。提前感谢。

您的JAXB类存在一些问题,我认为您复制粘贴并错误地更改了一些名称。
@XMLType
中的以下元素必须定义为
@xmlement

@XmlType(name = "Request",propOrder = {
    "header",
    "body",
    "signature"
})
无论如何,假设这些课程是正确的。您将需要2个更改来生成在不同名称空间中引用元素的XML

  • 使用
    @XMLSchema
    将名称空间移动到包级别。i、 e在包级别添加package-info.java以指定名称空间
  • Employee
    类中为
    Address
    元素提供自己的命名空间。如果每个元素不在父命名空间中,则必须在此级别重写
package info.java

@XmlSchema(
        namespace = "http://www.test.com",
        elementFormDefault = XmlNsForm.QUALIFIED)
package int1.d;

import javax.xml.bind.annotation.*;
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;
    }
}
@XmlSchema(
        namespace = "http://www.w3.org/2000/09/xmldsig#",
        elementFormDefault=XmlNsForm.QUALIFIED )    
package int1.d2;

import javax.xml.bind.annotation.*;
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;
    }


}
Employee.java

@XmlSchema(
        namespace = "http://www.test.com",
        elementFormDefault = XmlNsForm.QUALIFIED)
package int1.d;

import javax.xml.bind.annotation.*;
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;
    }
}
@XmlSchema(
        namespace = "http://www.w3.org/2000/09/xmldsig#",
        elementFormDefault=XmlNsForm.QUALIFIED )    
package int1.d2;

import javax.xml.bind.annotation.*;
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;
    }


}
package info.java

@XmlSchema(
        namespace = "http://www.test.com",
        elementFormDefault = XmlNsForm.QUALIFIED)
package int1.d;

import javax.xml.bind.annotation.*;
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;
    }
}
@XmlSchema(
        namespace = "http://www.w3.org/2000/09/xmldsig#",
        elementFormDefault=XmlNsForm.QUALIFIED )    
package int1.d2;

import javax.xml.bind.annotation.*;
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;
    }


}
Address.java

@XmlSchema(
        namespace = "http://www.test.com",
        elementFormDefault = XmlNsForm.QUALIFIED)
package int1.d;

import javax.xml.bind.annotation.*;
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;
    }
}
@XmlSchema(
        namespace = "http://www.w3.org/2000/09/xmldsig#",
        elementFormDefault=XmlNsForm.QUALIFIED )    
package int1.d2;

import javax.xml.bind.annotation.*;
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>

124
bae
第1行
第2行

我们可以获得以下格式的输出吗?第二个命名空间应位于地址属性级别。124 bae line1 line2据我所知,使用JAXB是不可能的。这是因为XML在语义上是正确的,名称空间是在根级别声明的。但是,您可以尝试在封送处理后使用
DOM
XPath
添加
xmlns
属性,以满足您的需求。