输出空元素

Rit*_*esh 6 jaxb

我有一个带有两个字段"name"和"address"的Object.JAXB在将对象转换为XMl时忽略空元素.

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

<name>xyz</name>
Run Code Online (Sandbox Code Playgroud)

但我想要的输出是什么

<name>xyz</name>
<address></address>
Run Code Online (Sandbox Code Playgroud)

我看过这个选项,@XmlElement(nillable="true")但这会给出输出

<name>xyz</name>
<address xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"/>
Run Code Online (Sandbox Code Playgroud)

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

提前致谢.

bdo*_*han 8

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

}
Run Code Online (Sandbox Code Playgroud)

更新#2

唯一值得关注的是,如果我在课程中有10个字段,我将不得不为所有字段编写.还有其他解决方案吗?

如果您使用EclipseLink MOXy作为您的JAXB提供程序(我是MOXy主管),那么您可以使用一个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;
    }

}
Run Code Online (Sandbox Code Playgroud)

包信息

然后,如果在包级别指定它,它将应用于该包中所有类型的映射字段/属性String.

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

import javax.xml.bind.annotation.adapters.*;
Run Code Online (Sandbox Code Playgroud)

欲获得更多信息