2013-03-01 8 views
6

ich eine XSD-Datei (yahoo.xsd), wo ich eine andere XSD-Datei wie folgt importieren:Symbol ist bereits definiert. Verwenden Sie JAXB Eigenschaft, um den Konflikt zu lösen

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

Die stock.xsd sieht wie folgt aus:

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

Wenn ich mit xjc kompiliere, erhalte ich die folgende Fehlermeldung:

[FEHLER] Eigenschaft "Symbol" ist bereits definiert. Verwenden Sie < jaxb: property> um diesen Konflikt zu lösen.

Ich fand im Grunde die Lösung für dieses hier auf SO (JAXB Compiling Issue - [ERROR] Property "Any" is already defined), aber ich kann es nicht zum Laufen bringen. Ich vermute, mein XPath ist falsch.

Dies ist die Einbindemappe ich verwende:

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

Wenn ich jetzt mit xjc kompilieren bin -b es sagt, dass die XPath Auswertungsergebnisse in einem leeren Zielknoten.

Ich muss wahrscheinlich die Symboldefinition umbenennen und dann auch den ref? Wie mache ich das automatisch?

+0

haben Sie versucht, das Schema als Basisknoten hinzufügen? z.B.?

Antwort

6

Lassen Sie mich an dieser Linie fragen:

<xs:element ref="Symbol"/> 

ist Symbol definiert in yahoo.xsd oder lokal in der gleichen XSD-Datei?

Ich werde versuchen, einige Fakten abzuleiten. Ich nehme an, Sie haben zwei XSDs: yahoo.xsd und some.xsd (erste in Ihrem Beitrag). Ich habe ein starkes Vertrauen Der Typ "Symbol" ist definiert in some.xsd und nicht in yahoo.xsd. Wenn es anders wäre, würde ich ein Namespacepräfix erwarten ("yahoo: Symbol"?). Jetzt

, ist es wahr, Ihre some.xsd in etwa so aussieht:

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

Wenn das, was ich sage, wahr ist, dann jaxb Bindung sollte wie folgt aussehen:

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

und erzeugt Java-Klasse wird:

@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

danke: Ich habe das schon ausprobiert, aber es hat nicht funktioniert. Aber eine andere Sache, die Sie gesagt haben, ist wahrscheinlich die Wurzel des Problems: Symbol wird irgendwo anders definiert und nur auf die Zeile referenziert, die ich mit meinem XPath ändern wollte. Ich habe das zu meinem ursprünglichen Beitrag hinzugefügt. Ich denke, ich muss beide automatisch umbenennen? Oder aktualisiert Jaxb automatisch alle Referenzen auf einen umbenannten Knoten? Ich kann es jetzt nicht ausprobieren, werde es aber heute Abend überprüfen. – Nicolas

+1

okay, so stellt sich heraus, das war genau das Problem. Ändern des Bindungsknotens in löst das Problem. – Nicolas