Понятие elementFormDefault квалифицировано/неквалифицировано при проверке xml на WSDL (схема xsd)
Я пытаюсь понять последствия elementFormDefault="qualified/unqualified"
в XML-схеме, встроенной в WSDL (SOAP 1.1, WSDL 1).
Например, у меня есть эта схема внутри WSDL:
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified"
targetNamespace="http://www.example.com/library">
<xsd:element name="person">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="name" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
В простом XML это явно недействительно, поскольку "имя" не имеет указанного пространства имен:
<lib:person xmlns:lib="http://www.example.com/library">
<name>XML Schema</name>
</lib:person>
в то время как это очевидно, потому что все элементы квалифицированы:
<lib:person xmlns:lib="http://www.example.com/library">
<lib:name>qualified xml</lib:name>
</lib:person>
Но удивительно, что libxml говорит, что справедливо также следующее:
<person xmlns="http://www.example.com/library">
<name>XML Schema</name>
</person>
Вопрос 1: Я предположил, что qualified
означает <person>
должен выглядеть примерно как <lib:person xmlns:lib="...">
. Но результаты, похоже, указывают на то, что атрибут xmlns
делает то же самое?
Предположим, что указанный выше XML является частью запроса SOAP, например
...
<s:Body>
<person xmlns="http://www.example.com/library">
<name>XML Schema</name>
</person>
</s:Body>
...
Вопрос 2: Является ли запрос выше действительным, если WSDL содержит схему qualified
, как показано выше? (обычный SOAP, без учета базового профиля WS-I)
Вопрос 3 Когда я рассматриваю базовый профиль WS-I (особенно 4.1.13 SOAP Body and Namespaces), вышеуказанный запрос все еще действителен? (считается ли person
"полем имен"?)
Ответы
Ответ 1
Указание "квалифицированного" в схеме, что почти всегда правильно, означает, что объявления локальных элементов (xs: element внутри xs: complexType) относятся к элементам в целевом пространстве имен схемы. Без него они ссылаются на элементы без пространства имен.
Таким образом, с вашим квалифицированным элементом элемент имени должен находиться в пространстве имен http://www.example.com/library. Он будет в этом пространстве имен, если либо
(a) вы явно помещаете его в это пространство имен, как в этом примере:
<lib:person xmlns:lib="http://www.example.com/library">
<lib:name>qualified xml</lib:name>
</lib:person>
(b) или вы используете пространство имен по умолчанию, как в этом примере:
<person xmlns="http://www.example.com/library">
<name>qualified xml</name>
</person>