JAXB 同一元素的不同命名空间 unmarshall

JAXB different namespaces for same element unmarshall

提问人:user3052078 提问时间:10/11/2023 最后编辑:Mark Rotteveeluser3052078 更新时间:10/13/2023 访问量:37

问:

我有以下架构 xml 示例

<a:tag xmlns:a="http://www.something.com/schema/01p00" ... >
    <a:root ... >

我已经为此架构创建了存根

@XmlRootElement(name = "Root", namespace = "http://www.something.com/schema/01p00")
@XmlAccessorType(XmlAccessType.FIELD)
public class Root{
...
}

并且知道架构已更新,但我感兴趣的元素是相同的。现在我有架构 2

<b:tag xmlns:b="http://www.something.com/schema/01p01" ... >
    <b:root ... >

为了使用新架构,我必须将类更改为:

@XmlRootElement(name = "Root", namespace = "http://www.something.com/schema/01p01")
@XmlAccessorType(XmlAccessType.FIELD)
public class Root{
...
}

因为我需要向后兼容,所以我希望只有一个类应该能够同时使用这两个命名空间。Root

我尝试创建以便为每个前缀使用正确的命名空间,但这无法按预期工作。package-info.java

@javax.xml.bind.annotation.XmlSchema(
namespace = "http://www.something.com/schema/01p00",
xmlns = {
    @javax.xml.bind.annotation.XmlNs(prefix = "a", namespaceURI = "http://www.something.com/schema/01p00"),
    @javax.xml.bind.annotation.XmlNs(prefix = "b", namespaceURI = "http://www.something.com/schema/01p01")
},
elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED,
attributeFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED
)
package schema.package;

如何在不复制所有类的情况下将同一类与这两个不同的命名空间一起使用?Root

Java XML JAXB

评论


答:

1赞 forty-two 10/13/2023 #1

恐怕 JAXB 不能做你想让它做的事情(至少不是以直接的方式)。一个@XmlRootElement或@XmlElement只能有一个(或没有)名称空间,并且不可能将两个或多个名称空间中的“相同”元素映射到同一个 Java 类。

XML 命名空间可以很好地映射到 Java 包,因此最好的办法是将(几乎)重复的类放在两个不同的包中,一个用于“01p00”命名空间,另一个用于“010p01”命名空间。

没有什么可以禁止“有趣的”类实现通用接口,这也许是以方便的方式解决向后兼容性的一种方法。

也许可以使用 XmlAdapters 将 Root(1) 和 Root(2) 类映射到同一个公共 Root 类,以便解组工作,但我看不出编组是如何工作的(将 Java 类转换为 XML)。