2013-03-01 30 views
6

Ho un file XSD (yahoo.xsd) dove ho importare un altro file XSD in questo modo:Il simbolo è già definito. Utilizzare proprietà JAXB per risolvere il conflitto

<xs:import schemaLocation="stock.xsd"/> 
    <xs:attribute name="lang" type="xs:NCName"/> 

Lo stock.xsd assomiglia a questo:

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" xmlns:yahoo="http://www.yahooapis.com/v1/base.rng"> 
<xs:import namespace="http://www.yahooapis.com/v1/base.rng" schemaLocation="yahoo.xsd"/> 
<xs:element name="quote"> 
<xs:complexType> 
    <xs:sequence> 
    <xs:element ref="Symbol"/> 
    </xs:sequence> 
    <xs:attribute name="symbol" use="required" type="xs:NCName"/> 
</xs:complexType> 
</xs:element> 
<xs:element name="Symbol" type="xs:NCName"/> 
</xs:schema> 

Quando compilo con xjc viene visualizzato il seguente messaggio di errore:

[ERRORE] La proprietà "Simbolo" è già definita. Utilizzare < jaxb: proprietà> per risolvere questo conflitto.

Fondamentalmente ho trovato la soluzione per questo qui su SO (JAXB Compiling Issue - [ERROR] Property "Any" is already defined) ma non riesco a farlo funzionare. Immagino che il mio XPath sia sbagliato.

Questo è il file di legame che sto usando:

<bindings xmlns="http://java.sun.com/xml/ns/jaxb" 
     xmlns:xsi="http://www.w3.org/2000/10/XMLSchema-instance" 
     xmlns:xs="http://www.w3.org/2001/XMLSchema" 
     version="2.1"> 
<bindings schemaLocation="yahoo.xsd" version="1.0" > 
    <!-- rename the value element --> 
     <bindings node="//xs:element[@name='quote']/xs:complexType/xs:sequence/xs:element[@ref='Symbol']"> 
      <property name="SymbolAttribute"/> 
    </bindings> 
</bindings> 

Se ora sto compilazione con xjc -b si dice che i risultati della valutazione XPath in un nodo di destinazione vuoto.

Probabilmente devo rinominare la definizione del simbolo e quindi anche l'ref? come farlo automaticamente?

+0

hai provato ad aggiungere lo schema come nodo di base? per esempio.?

risposta

6

permettetemi di chiedere su questa linea:

<xs:element ref="Symbol"/> 

è simbolo definito in yahoo.xsd o localmente nello stesso file XSD?

Proverò a dedurre alcuni fatti.

Suppongo che tu abbia due XSD: yahoo.xsd e some.xsd (il primo nel tuo post). I have strong confidence Il tipo "Symbol" è definito in some.xsd e non in yahoo.xsd. Se fosse diversamente mi aspetterei un prefisso per lo spazio dei nomi ("yahoo: Symbol"?).

Ora, è vero che il vostro some.xsd è simile a questo:

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" xmlns:yahoo="http://www.yahooapis.com/v1/base.rng" > 
    <!-- It's not important right now: --> 
    <!--<xs:import namespace="http://www.yahooapis.com/v1/base.rng" schemaLocation="yahoo.xsd"/>--> 

    <!-- declaration you omitted in your post, it's only example --> 
    <xs:element name="Symbol"> 
     <xs:simpleType> 
      <xs:restriction base="xs:integer"> 
       <xs:minInclusive value="0"/> 
       <xs:maxInclusive value="100"/> 
      </xs:restriction> 
     </xs:simpleType> 
    </xs:element> 

    <xs:element name="quote"> 
     <xs:complexType> 
      <xs:sequence> 
      <xs:element ref="Symbol"/> 
      </xs:sequence> 
      <xs:attribute name="symbol" use="required" type="xs:NCName"/> 
     </xs:complexType> 
    </xs:element> 
</xs:schema> 

Se ciò che dico è vero, allora il vostro legame JAXB dovrebbe assomigliare a questa:

<bindings xmlns="http://java.sun.com/xml/ns/jaxb" 
     xmlns:xsi="http://www.w3.org/2000/10/XMLSchema-instance" 
     xmlns:xs="http://www.w3.org/2001/XMLSchema" 
     version="2.1"> 
    <bindings schemaLocation="some.xsd"> <!-- not yahoo.xsd --> 
     <bindings node="//xs:element[@name='quote']/xs:complexType/xs:sequence/xs:element[@ref='Symbol']"> 
      <property name="SymbolAttribute" /> 
     </bindings> 
    </bindings> 

</bindings> 

e generati classe java sarà:

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(name = "", propOrder = { 
    "symbolAttribute" 
}) 
@XmlRootElement(name = "quote") 
public class Quote { 

    @XmlElement(name = "Symbol") 
    protected int symbolAttribute; 
    @XmlAttribute(name = "symbol", required = true) 
    @XmlJavaTypeAdapter(CollapsedStringAdapter.class) 
    @XmlSchemaType(name = "NCName") 
    protected String symbol; 
    .... 
+0

grazie: l'ho già provato ma non ha funzionato. Ma un'altra cosa che hai detto è probabilmente la radice del problema: il simbolo è definito da qualche altra parte e riferito alla linea che ho provato a cambiare con il mio XPath. L'ho aggiunto al mio post originale. Credo di dover rinominare automaticamente entrambi? O Jaxb aggiorna automaticamente tutti i riferimenti a un nodo rinominato? Non posso provarlo ora ma lo controllerò stasera. – Nicolas

+1

ok, quindi risulta che questo era esattamente il problema. La modifica del nodo di bindings in risolve il problema. – Nicolas

Problemi correlati