xml - JAXB - 仅为元素的特定子类型设置 XmlAdapter?

标签 xml xml-serialization jaxb

我必须生成一个 xml 元素,该元素的值可以是任何“原始类型”(xsd:string、xsd:boolean 等)。示例:

<field xsi:type="xsd:string" name="aString">String Value</field>
<field xsi:type="xsd:dateTime" name="aDate">2011-10-21</field>
<field xsi:type="xsd:dateTime" name="aDateTime">2011-10-21T12:00:00</field>
...

所以,我使用这个实现让 JAXB 决定原始类型的 xsi:type:

public class Field {
    @XmlAttribute
    private String name;

    @XmlElement
    Object value;
}

它按预期工作,但所有 java.util.Date 获取类型 xs:dateTime ...

现在我只想在“值”对象是 java.util.Date 的实例时更改编码器的行为,以获取如下字段:

<field xsi:type="xsd:date" name="aDate">2011-10-21</field>
<field xsi:type="xsd:dateTime" name="aDateTime">2011-10-21T12:00:00</field>

所以我创建了一个适配器,但是如果我尝试这样做:

@XmlElement
@XmlJavaTypeAdapter(DateAdapter.class)
Object value;

适配器必须处理 java.lang.Object 类型

public class DateAdapter extends XmlAdapter<String, Object> {...}

但我不想为所有其他对象(Integer、Double 等)松开 JAXB 编码器......

有没有办法为元素的特定子类型设置适配器?

最佳答案

虽然我来自 XSD 并从那里生成类,但我遇到了类似的情况。也就是说,该解决方案也应该适用于您。

在我的例子中,我想在 XSD 模型中扩展一个简单字符串的使用,以便它在 Java 代码中作为 UUID 出现,然后另一个在其他地方作为类出现,等等。 XML端,都是字符串(xs:string),那么java端如何把所有这些字符串分到不同的类型...

我最后做的是,在 XSD 中,我为每种情况创建了简单类型,这里是 UUID 声明:

并在需要时使用它而不是字符串。

然后我创建了一个绑定(bind)文件,我在其中指定了我的 XmlAdaptor,就像你所做的一样,除了现在我有单独的目标,因此可以使用多个专门针对每个 xml“类型”的适配器。

现在,您在这里遇到的另一个困难是,在 Java 端,您的字段表示只是一个对象。我想你一旦知道了类型属性就转换它。也许为每个案例创建一个字段子类,这将允许您更改 typeADaptor 声明。

关于xml - JAXB - 仅为元素的特定子类型设置 XmlAdapter?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7900268/

相关文章:

Android Studio 3.2.1 : Layout preview not working for all projects, 加载旧项目后

c++ - 序列化boost数组

c# - XML 序列化和命名空间前缀

c# - Xml序列化-直接渲染Root下的对象列表-Xml-Element

java - 带有未知@XmlRootElement 的 Jaxb Unmarshall

java - 如何维护xsd中的元素版本

windows - XML 编辑/查看软件

c# - 如何使用 C# 将 XML 解析为 lisp 的 S-Expression?

java - Android - fragment findViewById() 始终为空?

java - 如何在不使用注释的情况下使用 JAXB 将 java 对象转换为 xml?