2011-08-31 10 views
11

Ho il seguente documento semplice XSD (foo.xsd):JAXB XJC - Risultati di valutazione XPath nel nodo di destinazione vuoto?

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

e vorrei accennare al compilatore XJC JAXB che l'elemento "Altezza" dovrebbe utilizzare un tipo di sicurezza di classe enum utilizzando un file di attacchi esterni, in questo modo (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> 

Ma quando ho eseguito il comando "xjc -b foo.xjb foo.xsd" ottengo il seguente errore:

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. 

L'espressione XPath mi sta bene, quindi immagino ci sia qualche sottile problema relativo ai namespace XML? Ho provato alcune combinazioni di utilizzo (o non) di uno spazio dei nomi predefinito, targetNamespace, ecc. Ma sempre lo stesso errore. Si noti che xjc genera da solo l'origine Java per il file XSD, senza il file di bind esterno, come previsto. Allo stesso modo, l'utilizzo delle definizioni di binding incorporato nel file XSD funziona come previsto.

Nota che sto usando la versione Java "1.6.0_26" e la versione xjc "JAXB 2.1.10 in JDK 6" su Mac OS 10.6.8.

Qualcuno può spiegare come raggiungere questo obiettivo senza modificare l'XSD originale?

risposta

26

Eh, si sta andando a calci da soli quando si vede il problema:

In foo.xsd, avete questo:

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

In foo.xjb, avete questo:

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

Nota "w3" vs. "w3c". Questi due attributi devono corrispondere esattamente, e quindi XPath funzionerà (altrimenti lo spazio dei nomi a cui si fa riferimento in xjb è diverso dallo spazio dei nomi XSD a cui si fa riferimento nell'XSD).

+0

Ha! Grazie per il paio di occhi in più; questo è quello che ottengo per scrivere XML a mano, suppongo =) – maerics

+0

Bounty proveniente non appena il sistema mi consente ... – maerics

+0

Aveva lo stesso problema, tuttavia il mio problema era che xsd non era nemmeno stato dichiarato come spazio dei nomi. DOH. –

Problemi correlati