2013-02-04 108 views
4

我有一個有兩個字段「名稱」和「地址」的對象。 JAXB在將對象轉換爲XMl時忽略空元素。輸出空元素

對於例如:如果我有名字=「XYZ」和地址= null,則出將

<name>xyz</name> 

但我想作爲一個輸出

<name>xyz</name> 
<address></address> 

我所見過的選項@XmlElement(nillable="true")但是這給輸出作爲

<name>xyz</name> 
<address xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"/> 

請幫我得到所需的輸出。

在此先感謝。

回答

5

A JAXB (JSR-222)實現將輸出一個空字符串作爲空元素值""值。您可以將address屬性設置爲此以獲得所需的效果。


更新#1

我已經更新了我的問題。基本上地址元素是NULL。 此解決方案是否也適用於此?

您可以利用Marshal Event Callbacks來調整address的值。

import javax.xml.bind.Marshaller; 
import javax.xml.bind.annotation.*; 

@XmlRootElement 
@XmlAccessorType(XmlAccessType.FIELD) 
public class Customer { 

    private String name; 
    private String address; 

    private void beforeMarshal(Marshaller marshaller) { 
     if(null == address) { 
      address = ""; 
     } 
    } 

    private void afterMarshal(Marshaller marshaller) { 
     if("".equals(address)) { 
      address = null; 
     } 
    } 

} 

更新#2

唯一要擔心的是,如果我在10個領域,我將有 寫,如果所有字段。還有其他解決方案嗎?

如果使用EclipseLink MOXy爲您的JAXB提供者(我是莫西鉛),那麼你可以使用一個XmlAdapter這個用例。

XmlAdapter(StringAdapter)

package forum14691333; 

import javax.xml.bind.annotation.adapters.XmlAdapter; 

public class StringAdapter extends XmlAdapter<String, String> { 

    @Override 
    public String marshal(String string) throws Exception { 
     if(null == string) { 
      return ""; 
     } 
     return string; 
    } 

    @Override 
    public String unmarshal(String string) throws Exception { 
     if("".equals(string)) { 
      return null; 
     } 
     return string; 
    } 

} 

包信息

然後,如果你在這將適用於所有映射字段包級別指定它/那包內String類型的屬性。

@XmlJavaTypeAdapter(value=StringAdapter.class, type=String.class) 
package forum14691333; 

import javax.xml.bind.annotation.adapters.*; 

更多信息

+1

嗨布萊斯,感謝您的快速反應。我更新了我的問題。基本上地址元素是NULL。這個解決方案是否也適用於此? – Ritesh

+0

@ Ritesh-我已經更新了我的回答 –

+1

謝謝Blaise..This解決方案。唯一值得關注的是,如果我在課堂上有10個領域,我將不得不爲所有領域寫作。還有其他解決方案嗎? – Ritesh

1

如果您使用的EclipseLink莫西爲您的JAXB提供者,那麼你可以使用

@XmlNullPolicy(emptyNodeRepresentsNull = true, nullRepresentationForXml = XmlMarshalNullRepresentation.EMPTY_NODE) 
@XmlElement(name = "address", nillable = true) 
private String address; 

通過使用這種方式,您不必爲所有字段編寫適配器

0

只需在字段上設置一個空字符串默認值即可。

@XmlElement(required="true") 
private String address = ""; 

,你會得到

<address></address>