Pregunta

Tengo un esquema XML:

<xsd:element name="Person">
 <xsd:complexType>
  <xsd:sequence>
   <xsd:element name="name" type="xsd:string" />
   <xsd:element name="lat" type="xsd:double" minOccurs="0"/>
   <xsd:element name="lon" type="xsd:double" minOccurs="0"/>
  </xsd:sequence>
 </xsd:complexType>
</xsd:element>

Y tengo un mensaje XML:

<Person>
 <name>Fred</name>
</Person>

Yo uso JAXB para auto-generar mis clases (es decir,Person.java, etc).

Así que en tiempo de ejecución puedo usar JAXB para deserializar el anterior mensaje XML y conseguir que una Persona instancia de objeto.Cuando hago un p.getLat() o p.getLon() los valores de retorno son 0.0 aunque el XML original no contiene <lat> o <lon> elementos.

Lo que hace que este peor es que, 0.0, 0.0 es válido para la latitud y la longitud.Es raro que una persona que se encuentra allí, pero eso es irrelevante!

Un artículo en el sitio de IBM propuso por medio de un elemento XML como metadatos para declarar explícitamente si el elemento opcional existe o no existe.es decir,

<xsd:element name="hasLat" type="xsd:boolean"/>
<xsd:element name="hasLon" type="xsd:boolean"/>

Así que el mensaje XML anterior sería:

<Person>
 <name>Fred</name>
 <hasLat>false</hasLat>
 <hasLon>false</hasLon>
</Person>

Esto parece un feo corte.Debe haber una manera adecuada con JAXB para comprobar si el elemento existido así que puedo confiar en el valor de retorno de mi getLat(), getLon()?

¿Fue útil?

Solución

No veo que el problema en absoluto.Para mí xjc genera un Person clase con las propiedades lat y lon con el tipo de Double.

Si me unmarshall un archivo XML con ninguna <lat> o <lon> elementos, el resultado del Person los objetos se null los valores de esas propiedades, como yo había esperado.

No sé cómo llegar 0.0 en cualquier lugar.

Mi Esquema XML:

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
        targetNamespace="http://www.example.com/person">
 <xsd:element name="Person">
  <xsd:complexType>
    <xsd:sequence>
    <xsd:element name="name" type="xsd:string" />
    <xsd:element name="lat" type="xsd:double" minOccurs="0"/>
    <xsd:element name="lon" type="xsd:double" minOccurs="0"/>
   </xsd:sequence>
  </xsd:complexType>
 </xsd:element>
</xsd:schema>

Mi Test.java:

import com.example.person.Person;
import javax.xml.bind.JAXB;
import java.io.File;

public class Test {
  public static void main(String[] args) {
    Person p = JAXB.unmarshal(new File("foo.xml"), Person.class);
    System.out.println(p.getName());
    System.out.println(p.getLat());
    System.out.println(p.getLon());
  }
}

Mi foo.xml:

<Person>
 <name>Fred</name>
 <lat>1.0</lat>
</Person>

Salida:

Fred
1.0
null

Otros consejos

La razón más probable para obtener 0.0 devuelto vs nulo es el uso del tipo Doble primitivo o Tipo de objeto doble. La primitiva doble tendrá un valor predeterminado de 0.0 si el valor es nulo, ya que nulo no es un valor válido para los tipos primitivos. El objeto Double le permitirá asignar un valor nulo a estos campos. Un pico en tu clase de Persona probablemente revelará esto.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top