Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用相同的名称标记创建@XmlElement 2次_Java_Xml_Jaxb_Unmarshalling - Fatal编程技术网

Java 使用相同的名称标记创建@XmlElement 2次

Java 使用相同的名称标记创建@XmlElement 2次,java,xml,jaxb,unmarshalling,Java,Xml,Jaxb,Unmarshalling,我想解组一个XML,并且节点的元素存在于多个类文件中,我需要知道是否可以使用相同的名称创建@xmlement标记2次,并将同一节点传递给两个不同的类 我有以下XML: <data> <properties> <id>ID123</id> <name>sss</name> <note>note</note> </properties&

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

我有以下XML:

<data>
    <properties>
        <id>ID123</id>
        <name>sss</name>
        <note>note</note>
    </properties>
</data>
我在
prop1
类中有
id
name
,在
prop2
类中有
note
。所有元素都在一个节点下。 我可以使用
@xmlement
标记两次相同名称的delcare数据类,并将同一节点传递给两个不同的类吗?我尝试了这个,但只能创建
prop1
类的实例


也在寻找其他选项来处理此场景

首先,您真的需要这样做吗。为什么不能拥有properties类,从中可以从Note部分和Id/Name部分获得包装器

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

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);
 };
}
因此,您需要额外的容器(属性)来存储该值,但它可以用于任何jaxb实现

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

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

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);
 };
}