Как создать пустой элемент с помощью JAXB - PullRequest
9 голосов
/ 27 февраля 2009

Я использую 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 ]

11 голосов
/ 27 февраля 2009

В XML <header/> и <header></header> - это одно и то же. Если вы действительно хотите первое, то используйте преттификатор. javax.xml.transform.TransformerFactory.newTransformer(), вероятно, сделает это для вас.

2 голосов
/ 27 июня 2012

Как @Tom Хотин, - сказал Тэклайн

<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>
2 голосов
/ 27 февраля 2009

Пустой тег для объекта String по сути является пустой строкой.

Если вы позвоните по следующему номеру, вы получите то, что ищете:

request.setHeader("")

Следует также отметить, что в XML следующие два объявления заголовка идентичны. У обоих из них нет дочерних текстовых узлов. По сути, они одинаковы и будут обрабатываться одинаково всеми синтаксическими анализаторами XML:

<header></header>

<header/>
0 голосов
/ 09 июля 2015

Я хотел то же самое, фактически <header/>, а не <header></header> во время процесса сериализации XML.

Поскольку нулевое значение, а не пустая строка, будет давать правильный результат, я изменил метод установки, чтобы явно установить значение в нуль:

public void setHeader(String header) {
    this.header = "".equals(header) ? null : header;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...