2009-02-27 2 views
8

Я использую JAXB для создания XML-сообщений. XML мне нужно создать это (для простоты):Как создать экземпляр пустого элемента с помощью JAXB

<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> 

BTW: Я использую this code, чтобы создать XML-строку.

Возможно ли сделать пустую бирку?

+0

Так что не так с установкой заголовок «» ? –

+0

Я хочу

и не
. – doekman

+0

@doekman Ehm, я знаю, что поздно, но на всякий случай. Чтобы сделать ТОЧНО, что вы хотите, вы можете использовать реализацию EclipseLink MOXy (http://www.eclipse.org/eclipselink/moxy.php) JAXB, которая имеет очень приятное расширение '@ XmlNullPolicy'. См. Пример [здесь] (http://stackoverflow.com/a/11748678/814702) (в разделе «Вариант № 2») – informatik01

ответ

11

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

+4

Привет @Tom. Не могли бы вы подробнее объяснить, как это сделать? – Vladimir

2

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

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

request.setHeader("") 

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

<header></header> 

<header/> 
2

Как @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> 
0

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

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

public void setHeader(String header) { 
    this.header = "".equals(header) ? null : header; 
}