#java #xml #web-services #wsdl #xsd
#java #xml #веб-службы #wsdl #xsd
Вопрос:
Можно ли установить значение атрибута xml на фиксированное значение при переопределении базового типа?
Например, мой базовый тип выглядит следующим образом:
<xs:complexType name="Parameter" abstract="true">
... stuff that all parameters have in common ...
<xs:attribute name="parameterType" type="ax21:parameterType"/>
</xs:complexType>
Тип ParameterType представляет собой перечисление с двумя возможными значениями:
<xs:simpleType name="parameterType">
<xs:restriction base="xs:string">
<xs:enumeration value="singleParameter" />
<xs:enumeration value="arrayParameter" />
</xs:restriction>
</xs:simpleType>
Тип параметра не должен использоваться, а служит только основой для двух расширяющих его сложных типов:
<xs:complexType name="ParameterImpl1">
<xs:complexContent>
<xs:extension base="ax21:Parameter">
...stuff specific for this implementation of parameter...
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="ParameterImpl2">
<xs:complexContent>
<xs:extension base="ax21:WS_Parameter">
...stuff specific for this implementation of parameter...
</xs:extension>
</xs:complexContent>
</xs:complexType>
И в этих подтипах я хотел бы установить для атрибута ParameterType фиксированное значение.
Есть ли какая-либо возможность сделать это?
Кроме того, я хотел бы объяснить предысторию в моем случае — потому что я думаю, что может быть более простое решение всей моей проблемы:
я пишу файл WSDL, а тип параметра используется в качестве входного параметра в операции. Он используется только как интерфейс для двух типов, расширяющих его, но при обработке запроса веб-службы в моем коде на стороне сервера Java (сгенерированном Axis2) я получаю только объект параметра и не могу найти способ определить, какой из двух конкретных подтипов фактически был передан в запросе. (За исключением ручного анализа xmlString объекта Parameter, которого я хочу избежать)
Надеюсь, мои объяснения достаточно точны — просто скажите мне, нужна ли вам дополнительная информация или вы не понимаете, что я пытаюсь сделать.
Заранее спасибо!
Обновить:
После дополнительных исследований по этой теме я думаю, что единственный способ сделать что-то подобное — использовать наследование путем ограничения и полиморфизма, как описано в этой статье:
http://www.ibm.com/developerworks/library/x-flexschema/
Таким образом, в этом случае базовый тип содержит атрибут, а наследующие классы «переопределяют» его, устанавливая фиксированное значение.
Комментарии:
1. К сожалению, ссылка из вашего обновления не работает с 2011 года.
2. Существует архивная версия по адресу web.archive.org/web/20130731050042/http://www.ibm.com /…
Ответ №1:
Как вы говорите, это может быть достигнуто с помощью ограничения, результирующий XSD будет выглядеть примерно так
<?xml version="1.0" encoding="utf-8" ?>
<!--Created with Liquid XML 2015 Developer Bundle Edition 12.1.2.5004 ([http://www.liquid-technologies.com][2])-->
<xs:schema elementFormDefault="qualified"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:complexType abstract="true"
name="Parameter">
<xs:attribute name="paramterType"
type="parameterType" />
</xs:complexType>
<xs:simpleType name="parameterType">
<xs:restriction base="xs:string">
<xs:enumeration value="singleParameter" />
<xs:enumeration value="arrayParameter" />
</xs:restriction>
</xs:simpleType>
<xs:complexType name="ParameterImpl1">
<xs:complexContent>
<xs:restriction base="Parameter">
<xs:attribute name="paramterType"
fixed="singleParameter"
type="parameterType" />
</xs:restriction>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="ParameterImpl2">
<xs:complexContent>
<xs:restriction base="Parameter">
<xs:attribute name="paramterType"
fixed="arrayParameter"
type="parameterType" />
</xs:restriction>
</xs:complexContent>
</xs:complexType>
</xs:schema>