Как создать экземпляр пустого элемента с помощью JAXB
Я использую JAXB для создания сообщений XML. XML, который мне нужно создать (для простоты):
<request>
<header/>
</request>
Мой код выглядит так:
import javax.xml.bind.annotation.*;
@XmlRootElement(name = "request")
public class Request {
private String header;
@XmlElement(required=true)
public String getHeader() {
return header;
}
public void setHeader(String header) {
this.header=header;
}
}
Проблема: header
элемент не отображается (есть заголовок null
). Если для заголовка задана пустая строка, отображается следующее:
<request>
<header></header>
</request>
Когда я использую как тип Object
вместо String
, результат еще хуже:
<request>
<header xsi:type="xs:string"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"></header>
</request>
Кстати: я использую этот код для создания строки XML.
Можно ли получить пустой тег?
Ответов (4)4
Как сказал @Tom Hawtin - tackline
<header/>
и то <header></header>
же самое. Парсеры выдадут вам "".
Вы должны добавить nillable
аннотацию к заголовку
@XmlElement(nillable=true, required=true)
public String getHeader() {
return header;
}
Я надеюсь, что этот код сгенерирует следующий XML для null
значения.
import javax.xml.bind.*;
import javax.xml.bind.annotation.*;
@XmlRootElement
public class Request {
public static void main(String[] args) throws JAXBException {
final Request request = new Request();
final JAXBContext context = JAXBContext.newInstance(Request.class);
final Marshaller marshaller = context.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT,
Boolean.TRUE);
marshaller.marshal(request, System.out);
System.out.flush();
}
@XmlElement(nillable=true, required=true)
private String header;
}
отпечатки
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<request>
<header xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"/>
</request>
Я хотел того же, <header/>
но не <header></header>
в процессе сериализации xml.
Поскольку значение NULL - а не пустая строка - даст правильный результат, я изменил свой метод установки, чтобы явно установить значение NULL:
public void setHeader(String header) {
this.header = "".equals(header) ? null : header;
}
Пустой тег для объекта String - это, по сути, пустая строка.
Если вы позвоните по следующему номеру, вы получите то, что ищете:
request.setHeader("")
Следует также отметить, что в XML следующие два объявления заголовка идентичны. Оба они не имеют дочерних текстовых узлов. По сути, они одинаковы и будут обрабатываться одинаково всеми синтаксическими анализаторами XML:
<header></header>
<header/>