Схема XML / JaxB - Как включить пустые перечисления, строки, целочисленные значения в схеме без ошибок проверки? - PullRequest
4 голосов
/ 10 октября 2011

Я попробовал пару вещей:

1)

<xs:simpleType name="matchAnalysisType">
    <xs:restriction base="xs:string">
        <xs:enumeration value="A"/>
        <xs:enumeration value=""/>
    </xs:restriction>
 </xs:simpleType>

JaxB НЕ генерирует перечисления и вместо этого помечает matchAnalysisType как строку для соответствующего типа элемента.

2) Используйте 'nillable':

 <xs:element name="matchAnalysisType" type="matchAnalysisType"  
     nillable="true">                
 </xs:element>

JaxB выдает ошибку, что '' недопустимо.

Эта проблема сохраняется и для других типов элементов, таких как следующие:

 <xs:element name="accountNumber" minOccurs="0">                
     <xs:simpleType>
         <xs:restriction base="xs:integer">
             <xs:totalDigits value="9"/>
         </xs:restriction>
     </xs:simpleType>
  </xs:element>

Я хотел бы иметь пример XML-файла, который позволяет это без ошибок проверки.

 <accountNumber></accountNumber> 

Мысли?

Ответы [ 2 ]

2 голосов
/ 10 октября 2011

JAXB не имеет имени по умолчанию для перечислимых значений, соответствующих "". Ваша реализация JAXB может генерировать перечисление Java, соответствующее этому типу схемы XML, если вы используете внешний файл привязок для предоставления имени.

binding.xml

<jxb:bindings
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:jxb="http://java.sun.com/xml/ns/jaxb"
    version="2.1">
    <jxb:bindings schemaLocation="your-schema.xsd">
        <jxb:bindings node="//xs:simpleType[@name='matchAnalysisType']/xs:restriction/xs:enumeration[@value='']">
            <jxb:typesafeEnumMember name="BLANK"/>
        </jxb:bindings>
    </jxb:bindings>
</jxb:bindings>

XJC Call

Файл привязки указывается в вызове XJC с помощью параметра -b:

xjc -b binding.xml your-schema.xsd

Для получения дополнительной информации

1 голос
/ 07 декабря 2011

Вот решение:

tyesafeEnumMemberName по умолчанию имеет значение generateError, и вы можете указать значение generateName.

Этот атрибут отсутствовал в нашем файле xjc. Теперь это исправляет автогенерацию.

<jxb:bindings schemaLocation="your.xsd" node="/xsd:schema"> 
                <jxb:globalBindings typesafeEnumMaxMembers="9000"         typesafeEnumMemberName="generateName" >
                            <xjc:simple/>
            </jxb:globalBindings>

...