更新时间:2023-10-01 22:48:16
以下解释了 JAXB (JSR-222) 基于您的模型.
Below is an explanation of how namespaces work in JAXB (JSR-222) based on your model.
Java 模型
包信息
以下是您的 @XmlSchema
注释的修改版本.它包含一些关键信息:
Below is a modified version of your @XmlSchema
annotation. It contains some key information:
namespace
- 将用于限定全局元素的默认命名空间(对应于 @XmlRootElement
和 @XmlElementDecl
注释(和本地基于 elementFormDefault
值的元素)没有指定其他命名空间.elementFormDefault
默认情况下,只有全局元素是命名空间限定的,但是通过将值设置为 XmlNsForm.QUALIFIED
,所有没有指定显式命名空间的元素都将使用 命名空间
值.xmlns
是 JAXB impl 应该用于这些命名空间的首选前缀集(尽管它们可能使用其他前缀).namespace
- The default namespace that will be used to qualify global elements (those corresponding to @XmlRootElement
and @XmlElementDecl
annotations (and local elements based on the elementFormDefault
value) that don't have another namespace specified.elementFormDefault
by default only global elements are namespace qualified but by setting the value to be XmlNsForm.QUALIFIED
all elements without an explicit namespace specified will be qualified with the namespace
value.xmlns
is the preferred set of prefixes that a JAXB impl should use for those namespaces (although they may use other prefixes).@XmlSchema(
namespace="http://mycompany/train",
elementFormDefault = XmlNsForm.QUALIFIED,
xmlns={
@XmlNs(prefix="train", namespaceURI="http://mycompany/train"),
@XmlNs(prefix="passenger", namespaceURI="http://mycompany/passenger")
}
)
package forum15772478;
import javax.xml.bind.annotation.*;
训练
由于Train
类对应的所有元素都对应于@XmlSchema
注解上指定的namespace
,所以我们不需要指定任何命名空间信息.
Since all the elements corresponding to the Train
class correspond to the namespace
specified on the @XmlSchema
annotation, we don't need to specify any namespace info.
@XmlRootElement
注释对应于一个全局元素.@XmlElementWrapper
和 @XmlElement
注释对应于本地元素.@XmlRootElement
annotation corresponds to a global element.@XmlElementWrapper
and @XmlElement
annotations correspond to local elements.package forum15772478;
import java.util.List;
import javax.xml.bind.annotation.*;
@XmlRootElement(name="Train")
public class Train {
private List<Passenger> passengers;
@XmlElementWrapper(name="Passengers")
@XmlElement(name="Passenger")
public List<Passenger> getPassengers() {
return passengers;
}
public void setPassengers(List<Passenger> passengers) {
this.passengers = passengers;
}
}
乘客
如果 Passenger
类上的属性对应的所有元素都在 http://mycompany/passenger
命名空间中,那么您可以使用 @XmlType
注释以覆盖 @XmlSchema
注释中的 namespace
.
If all the elements corresponding to properties on the Passenger
class will be in the http://mycompany/passenger
namespace, then you can use the @XmlType
annotation to override the namespace
from the @XmlSchema
annotation.
package forum15772478;
import javax.xml.bind.annotation.*;
@XmlType(namespace="http://mycompany/passenger")
public class Passenger {
private String ticketNumber;
@XmlElement(name="TicketNumber")
public String getTicketNumber() {
return ticketNumber;
}
public void setTicketNumber(String ticketNumber) {
this.ticketNumber = ticketNumber;
}
}
或者,您可以在属性级别覆盖命名空间.
Alternatively you can override the namespace at the property level.
package forum15772478;
import javax.xml.bind.annotation.*;
public class Passenger {
private String ticketNumber;
@XmlElement(
namespace="http://mycompany/passenger",
name="TicketNumber")
public String getTicketNumber() {
return ticketNumber;
}
public void setTicketNumber(String ticketNumber) {
this.ticketNumber = ticketNumber;
}
}
演示代码
可以运行以下演示代码来证明一切正常:
The following demo code can be run to prove that everything works:
演示
package forum15772478;
import java.io.File;
import javax.xml.bind.*;
public class Demo {
public static void main(String[] args) throws Exception {
JAXBContext jc = JAXBContext.newInstance(Train.class);
Unmarshaller unmarshaller = jc.createUnmarshaller();
File xml = new File("src/forum15772478/input.xml");
Train train = (Train) unmarshaller.unmarshal(xml);
Marshaller marshaller = jc.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.marshal(train, System.out);
}
}
input.xml/输出
在下面的 XML 中,我添加了您问题中 XML 文档中缺少的必要命名空间声明.
In the XML below I have added the necessary namespace declarations that were missing from the XML document in your question.
<train:Train
xmlns:train="http://mycompany/train"
xmlns:passenger="http://mycompany/passenger">
<train:Color>Red</train:Color>
<train:Passengers>
<train:Passenger>
<passenger:TicketNumber>T101</passenger:TicketNumber>
</train:Passenger>
</train:Passengers>
</train:Train>
了解更多信息