jaxb - 注释向元素添加属性

标签 jaxb

我正在本着这种精神升级当前具有 XML 表示形式的 Java 对象:

<myObjects>
    <myObject uid="42" type="someEnum">
        <name>Waldo</name>
        <description>yada yada</description>
        <myElement>some_string</myElement>
        ...
    </myObject>
    ...
</myObjects>

myElement 是可选的 - 在 Java 中它可以为 null/在 XML 中可以省略。
我添加的字段myElement 具有实际值相关 (为了保持与以前的 XML 的兼容性,它本身是可选的)

我正在努力避免这种情况:

    <myElement>some_string</myElement>
    <myAttr>foo</myAttr>

并且更喜欢这样的东西:

    <myElement myAttr="foo">some_string</myElement>

但是我花了两天时间思考如何注释它。

  • 我想用 XmlTransient 标记它,并让 XmlAnyElement 在解码时捕获它 - 但这似乎在将对象从 Java 编码回XML。
  • 我尝试为该元素创建一个 XmlAdapter - 但 unmarshal 方法仅获取内部内容(“some_string”)。 我是否错过了这种技术的某些东西?
  • 有没有办法只获取字符串形式的元素(“some_string”),我将自己处理它?
  • 您推荐其他方法吗?

最佳答案

您可以使用EclipseLink JAXB (MOXy) @XmlPath 扩展可以轻松完成此任务:

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlRootElement;

import org.eclipse.persistence.oxm.annotations.XmlPath;

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class MyObject {

    @XmlAttribute
    private int uid;

    @XmlAttribute
    private String type;

    private String name;

    private String description;

    private String myElement;

    @XmlPath("myElement/@myAttr")
    private String myAttr;

}

此类将与以下 XML 交互:

<myObject uid="42" type="someEnum">
    <name>Waldo</name>
    <description>yada yada</description>
    <myElement myAttr="foo">some_string</myElement>
</myObject>

使用以下演示代码:

import java.io.File;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;

public class Demo {

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance(MyObject.class);

        File file = new File("input.xml");
        Unmarshaller unmarshaller = jc.createUnmarshaller();
        MyObject myObject = (MyObject) unmarshaller.unmarshal(file);

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(myObject, System.out);
    }

}

要将 MOXy 指定为 JAXB 实现,您需要在与模型类相同的包中包含一个名为 jaxb.properties 的文件,其中包含以下条目:

javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory

有关 MOXy 基于 XPath 的映射的更多信息,请参阅:

关于jaxb - 注释向元素添加属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4192687/

相关文章:

jaxb - 如何让我的 JAXB 输出包含对创建它的 XSD 的引用?

Java webservices - 在请求 header 中发送对象

java |属性的可变值

java - 当一个或多个元素是列表时(maxOccurs=unbounded),是否可以让 JAXB 忽略 <sequence> 中元素的顺序?

java - 删除使用 xjc 命令生成的 java 文件中的分数

java - 使用 jaxb 从 xml 生成 java 类时缺少类

java - 如何扩展complexType但子类型中没有子元素?

java - Jaxb 解码为单例?

android - 是否可以在 Android 中使用 JAXB

java - JAXB 编辑列表 setter/getter ?