Есть (как минимум) 2 способа сделать это.
- Если классы сами, а не сгенерированы автоматически из xsd или подобного, вы можете использовать адаптер.
Например, класс Корзина:
@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 как ноль.
Если ваши классы сгенерированы из xsd, вы могли бы упомянуть, что поле может быть пустым.
Например, как показано ниже:
<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>
Результат будет тот же, значение равно нулю.
Использование адаптера мне больше нравится, но зависит от вашего случая.Надеюсь, один из случаев охватывает вас.