2013-03-01 8 views
6

mam pliku XSD (yahoo.xsd) Gdzie mogę zaimportować inny plik xsd takiego:Symbol jest już zdefiniowany. Użyj własności JAXB aby rozwiązać konflikt

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

stock.xsd wygląda tak:

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

Podczas kompilowania przy pomocy xjc pojawia się następujący komunikat o błędzie:

[BŁĄD] Właściwość "Symbol" jest już zdefiniowany. Użyj opcji < jaxb: property>, aby rozwiązać ten konflikt.

Zasadniczo znalazłem rozwiązanie dla tego tutaj na SO (JAXB Compiling Issue - [ERROR] Property "Any" is already defined), ale nie mogę go uruchomić. Zgaduję, że mój XPath jest zły.

Jest to plik wiązania Używam:

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

Jeśli jestem teraz kompilacji z XJC -b mówi, że wyniki oceny XPath w pustym węzła docelowego.

Prawdopodobnie muszę zmienić nazwę definicji symbolu, a następnie również ref? jak to zrobić automatycznie?

+0

Czy próbowałeś dodać schemat jako węzeł podstawowy? na przykład.?

Odpowiedz

6

Zadam o tej linii:

<xs:element ref="Symbol"/> 

Symbol jest zdefiniowana w yahoo.xsd lub lokalnie w tym samym pliku XSD?

Spróbuję wydedukować kilka faktów.

Zakładam, że masz dwa XSD: yahoo.xsd i some.xsd (pierwszy w twoim poście). Mam silne zaufanie Typ "symbol" jest zdefiniowany w some.xsd, a nie w yahoo.xsd. Gdyby było inaczej, oczekiwałbym przedrostka przestrzeni nazw ("yahoo: Symbol"?).

Teraz, czy to prawda Twój some.xsd wygląda podobnie do tego:

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

Jeśli to, co mówię, jest prawdą, wówczas wiązanie JAXB powinna wyglądać następująco:

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

i generowanych klasa java będzie:

@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

dzięki: Próbowałem już tego, ale nie działało. Ale inna rzecz, o której mówisz, jest prawdopodobnie źródłem problemu: symbol jest zdefiniowany gdzieś indziej i odnosi się tylko do linii, którą próbowałem zmienić przy pomocy XPath. Dodałem to do mojego oryginalnego wpisu. Chyba muszę automatycznie zmienić ich nazwę? Czy Jaxb automatycznie aktualizuje wszystkie odniesienia do węzła o zmienionej nazwie? Nie mogę tego teraz wypróbować, ale sprawdzę to dziś wieczorem. – Nicolas

+1

okay, więc okazało się, że to był dokładnie problem. Zmiana węzła powiązań na rozwiązuje problem. – Nicolas