Вопрос:
У меня есть XML, для которого я хочу написать определение схемы. Проблема в том, что я не знаю, как определить xsi: type как атрибут. Вот элемент XML:
<SerializedData xsi:type=»xs:double»>300.0</SerializedData>
Мое определение XML-схемы до сих пор выглядит следующим образом:
<complexType name=»SerializedDataType»> <simpleContent> <extension base=»double»> </extension> </simpleContent> </complexType>
Я также попытался определить его, как предложил Ян Робертс:
<element name=»SerializedData»/>
Однако, когда я использую конструктор BPEL для его инициализации следующим образом:
<SerializedData xsi:type=»xs:double»>300.0</SerializedData>
Я получаю следующее предупреждение:
Введенное вами фиксированное значение не представляется корректным XML (что необходимо для правильной работы некоторых типов фиксированных значений). Он будет сохранен в текстовом формате.
Если я инициализирую его так, то нет предупреждения:
<SerializedData>300.0</SerializedData>
Но проблема в том, что веб-служба, которую я пытаюсь вызвать, ожидает, что запрос SOAP-сообщения будет включать атрибут xsi: type = “xs: double”. Как я могу отправить сообщение с запросом SOAP?
Любая помощь будет принята с благодарностью!
Лучший ответ:
Вам не нужно – просто объявить элемент без какого-либо типа.
<element name=»SerializedData» />
Атрибут xsi:type используется для указания правилу проверки схемы, что реальный тип конкретного экземпляра элемента не является объявленным типом элемента, а скорее является подтипом, полученным из объявленного типа. Объявив элемент без типа, вы говорите, что он может иметь любой тип, и вы будете использовать xsi:type в экземпляре, чтобы указать, какой из них.
Строго вы объявляете элемент, тип которого является “ur-type”, который является корнем иерархии типов XML-схемы, – все типы, простые и сложные, в конечном итоге происходят из ur-типа. Если вы хотите ограничить элемент SerializedData только простым контентом (без подэлементов или атрибутов), объявите его как
<element name=»SerializedData» type=»anySimpleType» />
Что касается второй части вашего вопроса, ваш дизайнерский инструмент прав, что в изоляции
<SerializedData xsi:type=»xs:double»>300.0</SerializedData>
неверно XML, поскольку пространство имен xsi не объявлено. Попробуйте добавить объявления пространства имен:
<SerializedData xmlns:xsi=»http://www.w3.org/2001/XMLSchema-instance» xmlns:xs=»http://www.w3.org/2001/XMLSchema» xsi:type=»xs:double»>300.0</SerializedData> Ответ №1
Атрибут xsi: type не должен быть объявлен в схеме: он неявно объявлен и может использоваться для любого элемента. Но в экземпляре он должен быть допустимым QName.
Если вы пишете
<SerializedData xsi:type=»xs:double»>300.0</SerializedData>
затем
(a), чтобы быть правильно сформированным пространством имен, вам нужно объявить пространство имен “xsi”
(b), чтобы быть действительным для схемы, вам также нужно объявить пространство имен “xs”.
Как указал Робертс, это означает, что вы должны написать
<SerializedData xmlns:xsi=»http://www.w3.org/2001/XMLSchema-instance» xmlns:xs=»http://www.w3.org/2001/XMLSchema» xsi:type=»xs:double»>300.0</SerializedData>