2013-02-04 51 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>