我们有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;
答案 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>
,但你可以更高一级。