我想要解组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
班级中有name
,prop1
,在note
班级中有prop2
。并且所有元素都在一个节点下。
我可以使用相同名称两次使用@XmlElement
标记对数据类进行delcare并将相同的节点传递给两个不同的类吗?我尝试了这个但能够创建只有prop1
类的实例。
寻找其他选项来处理这种情况
答案 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实现,它需要大量的代码。