创建具有相同名称标记2次的@XmlElement

时间:2015-03-18 08:34:53

标签: java xml jaxb unmarshalling

我想要解组XML并且node的元素存在于多个类文件中,我需要知道我们是否可以使用相同的文件创建@XmlElement个标记2次命名并将同一节点传递给两个不同的类别

我有以下XML:

<data>
    <properties>
        <id>ID123</id>
        <name>sss</name>
        <note>note</note>
    </properties>
</data>

根类文件

@XmlRootElement(name="data")
public class Data {
    prop1 prop1;
    prop2 prop2;

    @XmlElement(name="properties")
    public prop1 getProp1(){
        return this.prop1;
    }
    public void setProp1(prop1 prop1){
        this.prop1 = prop1;
    }

    @XmlElement(name="properties")
    public prop2 getProp2(){
        return this.prop2;
    }
    public void setProp2(prop2 prop2){
        this.prop2 = prop2;
    }
}

public class prop1{
    private String id;
    private String name;

    @XmlElement(name="id")
    //setters and getters for id node

    @XmlElement(name="name")
    //setters and getters for name node
}

public class prop2{
    private String note;

    @XmlElement(name="note")
    //setters and getters for note node
}

我在id班级中有nameprop1,在note班级中有prop2。并且所有元素都在一个节点下。 我可以使用相同名称两次使用@XmlElement标记对数据类进行delcare并将相同的节点传递给两个不同的类吗?我尝试了这个但能够创建只有prop1类的实例。

寻找其他选项来处理这种情况

1 个答案:

答案 0 :(得分:0)

首先,你真的需要这样做吗?为什么你不能拥有属性类,你将从Note部分和Id / Name部分获得包装器。

一种方法是将xml属性映射到xml中,并使用封送/解组事件将其转换为你的prop类。

public class Properties {
@XMLElement
String id;
@XMLElement
String name;
@XMLElement
String note;
}

public class Data {
 @XMLElement
 Properties properties;
 @XMLTransient
 Prop1 prop1
 ....

 void afterUnmarshal(Unmarshaller unm, Object parent) {
    prop1.id = properties.id;
    prop1.name = prperites.name;
    prop2.note = properties.note;
 };

 boolean beforeMarshal(Marshaller mar) {  
    prop1 = new Prop1(properties.id,properties.name);
    prop2 = new Prop2(properties.note);
 };
}

所以你需要额外的容器(Properties)来存储值,但是它可以用于任何jaxb实现。

为了避免使用容器,您可以使用XMLAdapter和jaxb扩展,它使用XMLTransforamtion从xml节点中提取必要的部分。 您可以在此处找到部分示例的描述:

http://blog.bdoughan.com/2010/08/xmltransformation-going-beyond.html

但是基于jaxb的eclipse实现,它需要大量的代码。