每个将被编写为 XML 元素的 Java 对象和其中的嵌套字段都有一个与之关联的名称空间。如果编组器在被编组的对象树中检测到多个名称空间,它将添加适当的名称空间前缀以在编组的 XML 中消除它们的歧义。
以下讨论适用于 Java 1.6 及更高版本。
类的实例
@XmlRootElement(name = "Message")
class Message {
@XmlAttribute(name = "Version")
public int getVersion() { return 1; }
}
将被序列化为:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Message Version="1"/>
因为 XML 消息只有一个元素 ( Message
),并带有默认命名空间 ( ""
)。
类的实例
@XmlRootElement(name = "Message", namespace = "http://example.com/schema/message")
class Message {
@XmlAttribute(name = "Version")
public int getVersion() { return 1; }
}
(添加到的自定义命名空间@XmlRootElement
)将被序列化为:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Message xmlns="http://example.com/schema/message" Version="1"/>
因为 XML 消息仍然只有一个元素 ( Message
),尽管使用自定义名称空间 ( http://example.com/schema/message
) 而不是默认名称空间。
类的实例
@XmlRootElement(name = "Message", namespace = "http://example.com/schema/message")
class Message {
@XmlElement(name = "Version")
public int getVersion() { return 1; }
}
(@XmlAttribute
改为@XmlElement
) 将被序列化为:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns2:Message xmlns:ns2="http://example.com/schema/message">
<Version>1</Version>
</ns2:Message>
因为 XML 消息现在有两个元素(Message
和Version
),具有不同的名称空间(http://example.com/schema/message
和""
分别)。因此,编组器被迫通过它们自己的名称空间来消除这两个元素的歧义。
类的实例
@XmlRootElement(name = "Message", namespace = "http://example.com/schema/message")
class Message {
@XmlElement(name = "Version", namespace = "http://example.com/schema/message")
public int getVersion() { return 1; }
}
(添加到的自定义命名空间@XmlElement
)将被序列化为:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns2:Message xmlns:ns2="http://example.com/schema/message">
<Version>1</Version>
</ns2:Message>
因为虽然 XML 消息有两个元素(Message
和Version
),但它们共享相同的命名空间(http://example.com/schema/message
)。因此,在确定每个元素属于哪个名称空间时不再有任何歧义,因此在生成的 XML 中只有一个名称空间声明。