扩展类型是否可以与其基本元素互换使用,反之亦然?
例如,我有一个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>
谢谢!
答案 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>
以下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的好习惯。解析器很好,元素属性和类型都具有相同的名称,但它让我们感到困惑!