2009-02-27 19 views
8

Uso JAXB para crear mensajes XML. El XML Necesito crear es (en aras de la simplicidad):Cómo crear instancias de un elemento vacío con JAXB

<request> 
    <header/> 
</request> 

Mi código es el siguiente:

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

El problema: No se muestra el elemento header (cabecera es null). Cuando cabecera se establece en una cadena vacía, se mostrará la siguiente:

<request> 
    <header></header> 
</request> 

Cuando utilizo como tipo Object en lugar de String, el resultado es aún peor:

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

Por cierto: estoy usando this code para crear la cadena XML.

¿Es posible obtener una etiqueta vacía?

+0

Entonces, ¿qué es malo en establecer cabecera a "" ? –

+0

Quiero

y no
. – doekman

+0

@doekman Ehm, sé que es tarde, pero por las dudas. Para hacer EXACTAMENTE lo que desea, puede usar la implementación de [EclipseLink MOXy] (http://www.eclipse.org/eclipselink/moxy.php) de JAXB, que tiene una extensión muy bonita '@ XmlNullPolicy'. Vea un ejemplo [aquí] (http://stackoverflow.com/a/11748678/814702) (en la sección "Opción n.º 2") – informatik01

Respuesta

11

En XML, <header/> y <header></header> son lo mismo. Si realmente quieres lo primero, entonces usa un prettifier. javax.xml.transform.TransformerFactory.newTransformer() probablemente lo haga por usted.

+4

Hola @Tom. ¿Podría explicar un poco más en detalles cómo hacerlo? – Vladimir

2

Una etiqueta vacía para un objeto String es esencialmente la cadena vacía.

Si se llama al siguiente, obtendrá lo que busca:

request.setHeader("") 

También debo señalar que, en XML las siguientes dos declaraciones de una cabecera son idential. Ambos no tienen nodos de texto secundarios. Estos son esencialmente los mismos y serán tratados de la misma por todos los analizadores XML:

<header></header> 

<header/> 
2

Como @ Tom Hawtin - tackline dijo

<header/> y <header></header> es igual. Parsers te dará "".

Usted tiene que poner en su anotación nillable cabecera

@XmlElement(nillable=true, required=true) 
public String getHeader() { 
    return header; 
} 

espero que este código generará siguiente XML para null valor.

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

impresiones

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

me querían lo mismo, efectivamente <header/> en lugar de <header></header> durante el proceso de serialización XML.

Desde un valor nulo - en lugar de una cadena vacía - producirá el resultado correcto, he modificado mi método de selección para establecer el valor explícitamente a nulo:

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