У нас есть xml-файл, который выглядит следующим образом. Обратите внимание, что наше приложение поддерживает все 3 из этих случаев:
<quantities>
<quantity>8</quantity> <!-- case 1 -->
<quantity></quantity> <!-- case 2 -->
<quantity/> <!-- case 3 -->
</quantities>
Сейчас мы создаем XML-схему для наших клиентов, чтобы помочь им проверить свои файлы перед отправкой их в наше приложение.
<xs:element name="quantity" type="xs:double"/>
Но приведенный выше XSD слишком прост. Это хорошая проверка для случая 1, но она отвергает случаи 2 и 3.
Итак, мы попытались решить эту проблему с помощью пользовательского типа. Тип, который может быть как двойным, так и пустой строкой.
<xs:simpleType name="double-or-empty">
<xs:union memberTypes="xs:double">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value=""/>
</xs:restriction>
</xs:simpleType>
</xs:union>
</xs:simpleType>
<xs:element name="quantity" type="double-or-empty"/>
С функциональной точки зрения это явное улучшение, но у него есть свои недостатки. Когда мы создаем наши классы Java с помощью инструмента Java xjc.exe
. Затем java будет использовать String
для представления этих полей. Что очень раздражает. На самом деле мы надеялись, что это (обнуляемые) java.lang.Double
полей.
Мы поэкспериментировали с идеей: создать файл xsd, который помечает это поле как nillable
.
<xs:element name="quantity" type="xs:double" nillable="true"/>
Мы узнали, что это по-прежнему не поддерживает случаи 2 и 3. Это просто добавляет к нему еще 1 случай:
<quantities>
<quantity xs:nil="true"/>
</quantities>
Однако несколько источников указывают на то, что использование xs:nil
может нарушить совместимость. Затем другие источники утверждают, что мы должны использовать настраиваемый атрибут, например. <quantity null="true"/>
Такого рода идеи в любом случае бесполезны, потому что они заставляют нас изменить формат XML, который мы использовали в течение длительного времени.
Итак, есть ли способ сохранить исходный формат и настроить инструмент XJC для использования здесь Doubles?