2016-12-14 13 views
0

拡張型を基本要素と置き換えて使用することは可能ですか、その逆も可能ですか?例えば、私はいくつかの要素を指定するWSDLを、拡張型は互換的に使用できますか?

を持っている:これらの要素のいずれかが他の場所で使用するために

<s:complexType name="Original"> 
    <s:sequence> 
    <s:element name="basic" type="s:string"/> 
    </s:sequence> 
</s:complexType> 

<s:complexType name="Extended"> 
    <s:complexContent mixed="false"> 
    <s:extension base="tns:Original"> 
     <s:sequence> 
     <s:element name="extra" type="s:string"/> 
     </s:sequence> 
    </s:extension> 
    </s:complexContent> 
</s:complexType> 

は、それが今まで可能ですか?

もちろん、さまざまなアプリケーションや実装ではさまざまなことが受け入れられるため、この質問はほとんどが正しいかどうかについての基準であり、標準に準拠しています。まだ規則に従いながら

<s:complexType name="Other"> 
    <s:sequence> 
    <s:element name="Original" type="tns:Original"/> 
    </s:sequence> 
</s:complexType> 

それをExtendedを与えることができるだろう:そうは次のようにWSDLは、メッセージがOriginalが含まれていることを指定した場合、さらに、私の元の例を拡張するために

?それ以外の方法はどうですか?など、あなたが少しハック何かをしようとした場合

何、:

<Original xsi:type="Extended"> 
    <basic>foo</basic> 
    <extra>bar</extra> 
</Original> 

ありがとう!

答えて

1

あなたが説明したことは完全に有効です。実際には、それを防ぐために 'block'属性を追加する必要があります。

「オリジナル」への参照がある場合は、XMLドキュメントでxsi:type = 'Extended'を使用し、 'Extended'で定義された定義を使用できます。しかし、その逆は真ではありません。あなたの例では、 'Extended'型の要素は 'Original'型だけを含むことはできません。

<?xml version="1.0" encoding="utf-8" ?> 
<!--Created with Liquid XML 2017 Developer Bundle Edition 15.0.0.6978 (https://www.liquid-technologies.com)--> 
<s:schema elementFormDefault="qualified" xmlns:s="http://www.w3.org/2001/XMLSchema"> 
    <s:element name="Root"> 
     <s:complexType> 
      <s:sequence> 
       <s:element name="OriginalElm" type="Original" minOccurs="0" maxOccurs="unbounded" /> 
       <s:element name="ExtendedElm" type="Extended" minOccurs="0" maxOccurs="unbounded" /> 
       <s:element name="OriginalBlocked" type="Original" block="extension" /> 
      </s:sequence> 
     </s:complexType> 
    </s:element> 
    <s:complexType name="Original"> 
     <s:sequence> 
      <s:element name="basic" type="s:string" /> 
     </s:sequence> 
    </s:complexType> 
    <s:complexType name="Extended"> 
     <s:complexContent mixed="false"> 
      <s:extension base="Original"> 
       <s:sequence> 
        <s:element name="extra" type="s:string" /> 
       </s:sequence> 
      </s:extension> 
     </s:complexContent> 
    </s:complexType> 
</s:schema> 

enter image description here

次のXMLは、それが「ブロック」属性のために拡張することができないようしかし、「OriginalBlocked」は、このバージョンが有効でないスキーマ

<?xml version="1.0" encoding="utf-8"?> 
<!-- Created with Liquid XML 2017 Developer Bundle Edition 15.0.0.6978 (https://www.liquid-technologies.com) --> 
<Root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="D:\Development2017\Liquid\Applications\XmlStudio\Tests\UserSamples\xsiType\XSDFile3.xsd"> 
    <OriginalElm> 
     <basic>string</basic> 
    </OriginalElm> 
    <OriginalElm xsi:type="Extended"> 
     <basic>string</basic> 
     <extra>string</extra> 
    </OriginalElm> 
    <ExtendedElm> 
     <basic>string</basic> 
     <extra>string</extra> 
    </ExtendedElm> 
    <OriginalBlocked> 
     <basic>string</basic> 
    </OriginalBlocked> 
</Root> 

に対して有効です。

<OriginalBlocked xsi:type="Extended"> 
     <basic>INVALID</basic> 
     <extra>INVALID</extra> 
    </OriginalBlocked> 

互換性に関する注記。 ほとんどの検証XMLパーサーはこれを正しく扱いますが(Xerces & .Netでテスト済み)、ほとんどのクライアントアプリケーションはxsi:type属性を探しません。彼らはこの追加データを無視する可能性が最も高いでしょうが、それはどのようにコード化されているかです。

もう1つの小さな点は、XxxxTypeという形式のcomplexTypesとsimpleTypesに名前を付ける良い習慣です。パーサーは、要素の属性と型がすべて同じ名前を持っていても問題ありませんが、われわれを混乱させます。

関連する問題