正在对空xml元素jaxb进行解组



我有一个像<tagName/>这样的空标记。当我对其进行解组时,如果此属性是long或float类型,则它为null。但是如果这个属性是字符串的类型,那么这个属性就是tagName = '';。编组后为<tagName></tagName>。如何在解组时将字符串java属性的空标记名设置为null?

至少有两种方法可以做到这一点。

  1. 如果类是您自己的,并且不是从xsd或类似内容自动生成的,则可以使用适配器

例如一个类Cart:

@XmlRootElement(name = "Cart")
@XmlAccessorType(XmlAccessType.FIELD)
public class Cart {
@XmlJavaTypeAdapter(EmptyTagAdapter.class)
protected String tagName;
}

可以使用如下适配器:

public class EmptyTagAdapter extends XmlAdapter<String, String> {
@Override
public String marshal(String arg0) throws Exception {
return arg0;
}
@Override
public String unmarshal(String arg0) throws Exception {
if(arg0.isEmpty()) {
return null;
}
return arg0;
}
}

对于如下所示的xml:

<Cart>
<tagName/>
</Cart>

您将得到空的tagName为null。

  1. 如果您的类是从xsd生成的,您可以提到该字段可以是nillable的

例如:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" version="2.1">
<xs:element name="Cart">
<xs:complexType>
<xs:all>
<xs:element name="tagName" type="xs:string" nillable="true" />
</xs:all>
</xs:complexType>
</xs:element>
</xs:schema>

然后您需要在xml中包含空元素xsi:nil="true",例如

<Cart xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<tagName/>
<tagName xsi:nil="true" />
</Cart>

它将具有相同的结果,值为null。

适配器的使用更符合我的喜好,但取决于您的情况。希望其中一个案例能涵盖你。

最新更新