几年以来,我在我的模型中使用了这种架构。
我有3个型号:
object.xsd:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:include schemaLocation="A.xsd"/>
<xs:include schemaLocation="B.xsd"/>
<xs:complexType name="object">
<xs:sequence>
<xs:element name="elt1" type="xs:token"/>
</xs:sequence>
</xs:complexType>
<xs:element name="object" type="object"/>
</xs:schema>
A.xsd:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:include schemaLocation="object.xsd"/>
<xs:complexType name="A">
<xs:complexContent>
<xs:extension base="object">
<xs:sequence>
<xs:element name="elt2" type="xs:token"/>
<xs:element name="elt3" type="xs:token"/>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
</xs:schema>
B.xsd:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:include schemaLocation="object.xsd"/>
<xs:complexType name="B">
<xs:complexContent>
<xs:extension base="object">
<xs:sequence>
<xs:element name="elt4" type="xs:token"/>
<xs:element name="elt5" type="xs:token"/>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
</xs:schema>
我在示例中使用xsi:type来选择对象是A还是B类型。以下是与A关联的示例:
<?xml version="1.0" encoding="UTF-8"?>
<object xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="A">
<elt1>test1</elt1>
<elt2>test2</elt2>
<elt3>test3</elt3>
</object>
我的一些部门在他们的ERP中导入XSD架构来创建他们的类对象。但是,他们必须调整我提供的文件才能正确导入它们并能够利用它们。
我想知道我是否正确使用xsi:type。实际上,在XSD中没有引用xsi名称空间(xmlns:xsi =&#34; http://www.w3.org/2001/XMLSchema-instance")。它与xsi:type引用相同,他们的ERP如何知道添加它?
答案 0 :(得分:1)
是的,您正在使用xsi:type正确。 (这不是我非常喜欢的设计,但那是无关紧要的。)
您不需要在架构中声明xsi名称空间(或前缀),只需在您的实例文档中声明。
我不太喜欢这种设计的一个原因是该模式的用户必须理解它才能创建实例文档,也就是说,他们需要了解实例文档需要包含xsi:type属性(因此要绑定“xsi”前缀。