2013-03-01 2 views
6

У меня есть XSD файл (yahoo.xsd), где я импортировать другой файл XSD так:Символ уже определен. Используйте JAXB свойство для разрешения конфликта

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

stock.xsd выглядит следующим образом:

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

Когда я компилирую с xjc, я получаю следующее сообщение об ошибке:

[ERROR] Свойство «Символ» уже определено. Используйте < jaxb: property> для разрешения этого конфликта.

В основном я нашел решение для этого здесь, на SO (JAXB Compiling Issue - [ERROR] Property "Any" is already defined), но я не могу заставить его работать. Я предполагаю, что мой XPath ошибочен.

Это связывание файла Я использую:

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

Если я сейчас компиляции с XJC -b это говорит о том, что результаты оценки XPath в пустом целевом узле.

Возможно, мне нужно переименовать определение символа, а затем ссылку? как это сделать автоматически?

+0

Вы пытались добавить схему в качестве базового узла? например.?

ответ

6

Позвольте мне спросить об этой линии:

<xs:element ref="Symbol"/> 

является символ определен в yahoo.xsd или локально в том же XSD файл?

Я попытаюсь вывести некоторые факты.

Я предполагаю, что у вас есть два XSD: yahoo.xsd и some.xsd (первый в вашем посте). У меня есть сильная уверенность Тип «Символ» определен в some.xsd, а не в yahoo.xsd. Если бы это было иначе, я ожидал бы некоторого префикса пространства имен («yahoo: Symbol»?).

Теперь, это правда, ваш some.xsd выглядит примерно так:

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

Если то, что я говорю правду, то ваш JAXB привязки должен выглядеть следующим образом:

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

генерировал java класс будет:

@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

спасибо: я уже пробовал это, но он не работал. Но еще одна вещь, которую вы сказали, вероятно, является корнем проблемы: Symbol определен где-то в другом месте и упоминается только в строке, которую я пытался изменить с помощью моего XPath. Я добавил это к своему оригинальному сообщению. Думаю, мне нужно автоматически переименовать их обоих? Или Jaxb автоматически обновляет все ссылки на переименованный узел? Я не могу попробовать это сейчас, но проверит его сегодня вечером. – Nicolas

+1

в порядке, так что получается, что это была именно проблема. Изменение узла привязок на решает проблему. – Nicolas

Смежные вопросы