Unmarshalling пустой элемент XML Jaxb - PullRequest
0 голосов
/ 07 декабря 2018

У меня есть пустой тег, подобный этому <tagName/>.Когда я демарширую его, если это свойство типа long или float, оно равно null.Но если это свойство является типом строки, оно равно tagName = '';.А после сортировки стоит <tagName></tagName>.Как я могу установить пустое имя тега, являющееся строковым свойством java, равным нулю при демаршаллинге?

1 Ответ

0 голосов
/ 07 декабря 2018

Есть (как минимум) 2 способа сделать это.

  1. Если классы сами, а не сгенерированы автоматически из 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>

Результат будет тот же, значение равно нулю.

Использование адаптера мне больше нравится, но зависит от вашего случая.Надеюсь, один из случаев охватывает вас.

...