2016-04-29 3 views
0

В настоящее время у меня есть несколько различных оберток элементов xml в классе.JAXB: Сделать имя элемента xml прозрачным

Я хочу добавить один атрибут в теги xml для элементов xml. Это будет работать как флаг для моего приложения.

Каждый элемент xml будет иметь другое значение атрибута, поэтому я решил собрать их вместе.

По этой причине я написал новый объект с двумя полями. Общее поле значения и поле строки, чтобы использовать его как атрибут.

К сожалению, я не могу найти способ извлечь значение из поля значений без присутствия тэга «мусор».

Есть ли способ сделать это. Чтобы быть более ясным, я представляю конкретные части кода.

@XmlRootElement(name = "client") 
class Client { 
    private List<String> names; 

    private List<Integer> salaries; 

    private List<Long> socialSecurityNos; 

    @XmlElementWrapper(name = "names") 
    @XmlElement(name = "name") 
    public List<String> getNames() { 
     return this.names; 
    } 

    @XmlElementWrapper(name = "salaries") 
    @XmlElement(name = "salary") 
    public List<String> getSalaries() { 
     return this.salaries; 
    } 

    @XmlElementWrapper(name = "socialsecuritynos") 
    @XmlElement(name = "socialsecurityno") 
    public List<String> getSocialSecurityNo() { 
     return this.socialSecurityNos; 
    } 
    ... 
    ... 
} 

Это производит следующие XML

<foo> 
    <names> 
     <name> 
      George 
     </name> 
     <name> 
      John 
     </name> 
    </names> 
    <salaries> 
     <salaries> 
     ... 
     ... 
     </salaries> 
    </salaries> 
    <socialSecurityNo> 
     <socialSecurityNo> 
     ... 
     ... 
     </socialSecurityNo> 
    </socialSecurityNo> 
</foo> 

новое значение атрибута пары класс, который я написал.

@XmlRootElement(name = "client") 
class GenericElement <T> { 
    private String attribute; 

    private T value; 

    public T getValue() { 
     return this.value; 
    } 

    @XmlAttribute(name = "flag") 
    public String getAttribute() { 
     return this.attribute; 
    } 

} 

И, конечно, я изменил типы Lists

@XmlRootElement(name = "client") 
class Client { 
    private List<GenericElement<String>> names; 

    private List<GenericElement<Integer>> salaries; 

    private List<GenericElement<Long>> socialSecurityNos; 

    ... 
    ... 

Я хочу, чтобы получить этот результат.

<foo> 
    <names> 
     <name flag="on"> 
      George 
     </name> 
     ... 
     <name flag="off"> 
      John 
     </name> 
    </names> 

    .... 
    ..... 
     </socialSecurityNo> 
    </socialSecurityNo> 
</foo> 

Вместо этого я получаю это с тегом значения «мусор».

<foo> 
    <names> 
     <name flag="on"> 
      <value>George</value> 
     </name> 
     ... 
     <name flag="off"> 
      <value>Value</value> 
     </name> 
    </names> 

    .... 
    ....  
    ....................</value> 
     </socialSecurityNo> 
    </socialSecurityNo> 
</foo> 

ответ

0

Должно быть обеспечена возможностью избавиться от лишних тегов значения по аннотированию сорбента для value поля с @XmlValue. Есть blog post от ведущего разработчика MOXy Blaise Doughan, который дает хороший обзор того, как он работает.

Таким образом, вы должны попробовать это:

@XmlRootElement(name = "client") 
class GenericElement <T> { 
    ... 
    @XmlValue 
    public T getValue() { 
     return this.value; 
    } 
    ... 
} 
+0

Видимо XmlValue работает только с с «известным» типа иначе NullPointerException выбрасывается во время сортировочных. – Chrys

+0

А я вижу, он не работает с универсальными типами. В этом случае [this] (http://stackoverflow.com/questions/8807296/jaxb-generic-xmlvalue/8901997#8901997) другой ответ должен сделать трюк. –

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