如果对象中的所有内容都为空,则避免使用XML中的空子标记

时间:2015-11-04 16:07:53

标签: xml jaxb

我们有JAXB对象marshing / unmarshalling XML。目前,我们得到这个标签,即使其中的所有内容都是空的。 如果所有子元素都为空,我们需要完全摆脱Top部分。(如果至少有一个不是空的,它应该存在。)

    <ns2:Top>
        <ns2:OrganizationName></ns2:OrganizationName>
        <ns2:Address>
            <ns2:Street1></ns2:Street1>
            <ns2:Street2></ns2:Street2>
            <ns2:City></ns2:City>
            <ns2:ZipPostalCode></ns2:ZipPostalCode>
        </ns2:Address>
    </ns2:Top>

JAXB类定义为:

    @XmlElement(name = "Top")
    protected Top top;

1 个答案:

答案 0 :(得分:1)

您可以通过设置或不设置字段来控制编组XML中出现的元素数量。

Root root = new Root();
root.setTop( new Top() );                   // (1)
root.getTop().setAddress( new Address() );  // (2)

使用第(1)和(2)行,编组产生

<root><top><address/></top></root>

只有第(1)行,XML将是

<root><top/></root>

省略两行产生

<root/>

一旦你将organizationName或地址设置为Top,并且将一些或所有String字段设置为空字符串(即&#34;&#34;),你将不得不编写一些代码来修剪无用的领域。 (如果没有使用的有用值,将字段设置为空字符串是非常值得怀疑的。)

稍后适配器是一个好主意。注释要保留的元素,顶部或上面的元素:

@XmlElement
@XmlJavaTypeAdapter(Adapter.class)
protected Top top;

编写适配器以调查对象层次结构,将其替换为空的顶级元素:

public class Adapter extends XmlAdapter {
    public Top unmarshal( Top v ) throws Exception {
        return v;
    }

    private boolean allEmpty( String... strings ){
        for( String s: strings ){
            if( s != null && ! s.equals( "" ) ) return false;
        }
        return true;
    }

    public Top marshal( Top top ) throws Exception {
        Address a = top.getAddress();
        return allEmpty( top.getOrganizationName(),
                         a.getStreet1(), a.getStreet1(),
                         a.getCity(), a.getPostalCode(),
                         a.getState(), a.getCountry() ) ? new Top() : top;
    }
}

我选择了Top,所以你保持空<top>,但你可以更高一级。