2016-04-29 160 views
0

目前,我在一個類中有許多不同的xml元素包裝。JAXB:使xml元素的名稱透明

我想爲xml元素的xml標籤添加一個屬性。 這將作爲我的應用程序的標誌。

每個xml元素都會有不同的屬性值,所以我想將它們打包在一起。

因此,我寫了一個有兩個字段的新對象。一個通用值字段和一個字符串字段用作屬性。

不幸的是,我無法找到一種方法來從值字段中提取值,而沒有「垃圾」xml標記的presens。

有沒有辦法做到這一點。 爲了更清楚我介紹了代碼的特定部分。

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

} 

,當然還有我改變了列表類型

@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

它應該可以通過@XmlValue標註爲value場,吸氣擺脫額外的價值標籤。 MOXy首席開發人員Blaise Doughan提供了一個blog post,可以很好地瞭解它的工作原理。

所以,你應該試試這個:

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

顯然XmlValue只能用一個「已知」的類型不拋出NullPointerException異常編組中。 – Chrys

+0

啊我看,它不適用於泛型類型。在這種情況下,[這](http://stackoverflow.com/questions/8807296/jaxb-generic-xmlvalue/8901997#8901997)其他答案應該做的伎倆。 –