2015-03-18 3 views
0

Я хочу, чтобы unmarshall XML, а элементы node присутствуют в нескольких файлах классов, мне нужно знать, можем ли мы создать тег @XmlElement с тем же именем и пройти тот же узел для двух различных классов

у меня есть следующий XML:
Создание @XmlElement с тем же именем тега 2 раза

<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 класс. И все элементы находятся под одним узлом. Можно ли использовать класс данных Delcare с тегом @XmlElement два раза с тем же именем и передать один и тот же узел двум различным классам? Я пробовал это, но смог создать экземпляр только класса prop1.

искать другие варианты тоже обрабатывать этот сценарий

ответ

0

Во-первых, вы действительно должны сделать это. Почему у вас нет класса свойств, из которого вы получите обертки из части «Примечание» и «Идентификация/имя».

Один из способов - сопоставление свойств 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, которое использует XMLTransforamtion для извлечения необходимых частей из вашего узла xml. Вы можете найти описание с примером частично ваше дело здесь:

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

Но основано на реализации затмения JAXB и требует значительного количества кода.

Смежные вопросы