XSD - 如何声明 xsi:type



几年来,我一直在我的模型中使用这种架构。

我有 3 种型号:

  • 作为主模型的对象,
  • A 和 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="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="http://www.w3.org/2001/XMLSchema-instance"( 的引用。xsi:type引用也是如此,他们的ERP如何知道添加它?

是的,您正确使用了 xsi:type。(这不是我非常喜欢的设计,但这无关紧要。

您无需在架构中声明 xsi 命名空间(或前缀(,只需在实例文档中声明即可。

我不太喜欢这种设计的一个原因是,这个模式的用户必须理解它才能创建实例文档,也就是说,他们需要了解实例文档需要包含 xsi:type 属性(因此绑定"xsi"前缀(。

最新更新