扩展类型可以互换使用吗?

时间:2016-12-14 08:10:46

标签: xsd wsdl

扩展类型是否可以与其基本元素互换使用,反之亦然?

例如,我有一个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>

是否有可能使用其中任何一个元素代替另一个?

当然,不同的应用程序/实现会接​​受不同的东西,所以这个问题主要是关于它是否正确,并遵循标准。

为了进一步扩展我的原始示例,如果WSDL指定消息包含Original,则如下所示:

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

是否可以在遵循惯例的同时给它Extended?或者另一种方式呢?

如果你尝试了一些有点hacky的东西,比如:

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

谢谢!

1 个答案:

答案 0 :(得分:1)

您所描述的内容完全有效。实际上你必须添加&#39;块&#39;属性以防止它。

所以,你可以参考原文&#39;你可以使用xsi:type =&#39; Extended&#39;在XML文档中,使用&#39; Extended&#39;定义的定义。然而,反之亦然,在您的示例中,类型为&#39;扩展&#39;不能只包含一个&#39;原创&#39;类型。

<?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对架构

有效
<?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&#39;由于&#39;块&#39;无法扩展,因此无效。属性。

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

关于兼容性的说明。 大多数验证XML解析器都会正确处理这些(我在Xerces&amp; .Net上测试过)但是大多数客户端应用程序都不会查找xsi:type属性。他们最有可能忽略这些额外的数据,但这取决于它们的编码方式。

另一个小问题,它是以XxxxType形式命名complexTypes和simpleTypes的好习惯。解析器很好,元素属性和类型都具有相同的名称,但它让我们感到困惑!