web-dev-qa-db-ja.com

WSDLに対してXMLを検証するときのelementFormDefault修飾/非修飾について(xsdスキーマ)

WSDL(SOAP 1.1、WSDL 1)に埋め込まれているXMLスキーマでのelementFormDefault="qualified/unqualified"の意味を理解しようとしています。

たとえば、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では、「name」に指定された名前空間がないため、これは明らかに無効です。

<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>

質問1qualified<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基本プロファイルは無視)

質問3WS-I Basicプロファイル(特に 4.1.13 SOAP Body and Namespaces )上記のリクエストはまだ有効ですか?(personは「名前空間修飾」と見なされますか?)

17
Felix Schwarz

スキーマで「修飾」を指定することは、ほとんどの場合正しいことですが、ローカル要素宣言(xs:complexType内のxs:element)がスキーマのターゲット名前空間の要素を参照することを意味します。それがないと、名前空間のない要素を参照します。

したがって、修飾された場合、あなたの場合、name要素は名前空間 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>
21
Michael Kay