7

我有一个包含两个字段“名称”和“地址”的对象。JAXB 在将对象转换为 XMl 时忽略空元素。

例如:如果我有 name="xyz" 和 address=null 那么 out 将是

<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"/>

请帮助我获得所需的输出。

提前致谢。

4

3 回答 3

9

JAXB (JSR-222)实现将输出一个空字符串值""作为一个空元素。您可以将address属性设置为此以获得所需的效果。


更新#1

我已经更新了我的问题。基本上地址元素是NULL。该解决方案是否也适用于此?

您可以利用Marshal 事件回调来调整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 个字段,我将不得不为所有字段编写 if。还有其他解决方案吗?

如果您使用EclipseLink MOXy作为您的 JAXB 提供程序(我是 MOXy 的负责人),那么您可以将 anXmlAdapter用于此用例。

XmlAdapter(字符串适配器)

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.*;

了解更多信息

于 2013-02-04T16:51:57.620 回答
1

如果您使用 EclipseLink MOXy 作为您的 JAXB 提供程序,那么您可以使用

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

通过这种方式,您不必为所有字段编写适配器

于 2016-07-25T09:12:52.050 回答
0

只需在字段上设置一个空字符串默认值。

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

你会得到

<address></address>
于 2017-11-16T16:25:19.943 回答