2011-08-31 53 views
11

Tengo el siguiente documento simple XSD (foo.xsd):JAXB XJC - Resultados de la evaluación XPath en un nodo objetivo vacío?

<?xml version="1.0" encoding="UTF-8"?> 
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
      targetNamespace="urn:foo"> 
    <xsd:element name="Person"> 
    <xsd:complexType> 
     <xsd:sequence> 
     <xsd:element name="Name" type="xsd:string"/> 
     <xsd:element name="Height"> 
      <xsd:simpleType> 
      <xsd:restriction base="xsd:string"> 
       <xsd:enumeration value="Short"/> 
       <xsd:enumeration value="Average"/> 
       <xsd:enumeration value="Tall"/> 
      </xsd:restriction> 
      </xsd:simpleType> 
     </xsd:element> 
     </xsd:sequence> 
    </xsd:complexType> 
    </xsd:element> 
</xsd:schema> 

y me gustaría hacer alusión al compilador JAXB XJC que el elemento de "Altura" debe utilizar una clase de enumeración segura tipo utilizando una archivo de enlaces externos, al igual que (foo.xjb):

<?xml version="1.0" encoding="UTF-8"?> 
<jxb:bindings xmlns:jxb="http://java.sun.com/xml/ns/jaxb" 
       xmlns:xsd="http://www.w3c.org/2001/XMLSchema" 
       jxb:version="2.0"> 
    <jxb:bindings schemaLocation="foo.xsd"> 
    <jxb:bindings node="//xsd:element[@name='Height']/xsd:simpleType"> 
     <jxb:typesafeEnumClass name="Height" /> 
    </jxb:bindings> 
    </jxb:bindings> 
</jxb:bindings> 

Pero cuando funciono con el comando "xjc -b foo.xjb foo.xsd" me sale el siguiente error:

parsing a schema... 
[ERROR] XPath evaluation of "//xsd:element[@name='Height']/xsd:simpleType" results in empty target node 
    line 6 of file:/Users/maerics/src/java/jaxb/foo.xjb 

Failed to parse a schema. 

La expresión XPath me parece bien, así que supongo que hay algún problema sutil relacionado con los espacios de nombres XML. He intentado algunas combinaciones de usar (o no) un espacio de nombres predeterminado, targetNamespace, etc., pero siempre el mismo error. Tenga en cuenta que xjc genera el origen de Java para el archivo XSD por sí mismo, sin el archivo de enlaces externos, como se esperaba. Del mismo modo, el uso de definiciones de enlace incrustadas en el archivo XSD funciona como se esperaba.

Tenga en cuenta que estoy usando la versión de Java "1.6.0_26" y la versión xjc "JAXB 2.1.10 en JDK 6" en Mac OS 10.6.8.

¿Alguien puede explicar cómo lograr este objetivo sin modificar el XSD original?

Respuesta

26

Je, vas a patear a sí mismo cuando se ve el problema:

En foo.xsd, tienes esto:

xmlns:xsd="http://www.w3.org/2001/XMLSchema" 

En foo.xjb, tiene esto:

xmlns:xsd="http://www.w3c.org/2001/XMLSchema" 

Nota "w3" vs. "w3c". Esos dos atributos deben coincidir exactamente, y entonces su XPath funcionará (de lo contrario, el espacio de nombres al que se hace referencia en su xjb es distinto del espacio de nombres XSD al que hace referencia en su XSD).

+0

¡Ja! Gracias por el par de ojos extra; eso es lo que obtengo al escribir XML a mano, supongo =) – maerics

+0

Bounty tan pronto como el sistema me permite ... – maerics

+0

Tenía el mismo problema, sin embargo, mi problema era que xsd ni siquiera se había declarado como un espacio de nombres. DOH. –

Cuestiones relacionadas