Xml XSD-如何声明xsi:type

Xml XSD-如何声明xsi:type,xml,types,xsd,xsi,Xml,Types,Xsd,Xsi,几年来,我一直在我的模型中使用这种架构 我有3种型号: 对象,它是主模型 A和B扩展对象模型并添加新元素 object.xsd: <?xml version="1.0" encoding="UTF-8"?> <xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs

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

我有3种型号:

  • 对象,它是主模型
  • A和B扩展对象模型并添加新元素
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>

测试1
测试2
测试3
我的一些partnair在他们的ERP中导入XSD模式来创建他们的类对象。但是,他们必须调整我提供的文件,以便正确导入它们并能够利用它们


我想知道我是否正确使用xsi:type。实际上,没有对xsi名称空间的引用(xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance)在XSD中。这与xsi:type引用相同,他们的ERP如何知道添加它?

是的,您正确地使用了xsi:type。(这不是我非常喜欢的设计,但这并不重要。)

您不需要在模式中声明xsi名称空间(或前缀),只需要在实例文档中声明


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

感谢Michael的快速回答。如果我正确使用xsi:type,如何帮助我的合作伙伴使用我提供的xsd?你说你不太喜欢这个解决方案,你用什么解决方案?(A)如果你设计了一个模式,那么你有责任编写文档告诉人们如何使用它。我帮不了你。(B) 与xsi:type相比,我将使用XSD 1.1条件类型分配,它允许您使用自己的属性来代替xsi:type来区分不同的消息类型。xsd1.1上的CTA是不可能的,因为我们合作伙伴的工具中没有实现此标准。文件已经存在,但还不够。他们不知道如何在软件中指定xsi:type。我能做的最好的事情就是修改我的模式,不要使用xsi。。。但是我被元素声明的一致性所阻碍。这已经超出了技术编程问题的界限,在非技术约束面前,这是一个架构和策略问题。你是对的。有关更多详细信息,请参阅复制链接。但是,从设计美学的角度来看,要求以这种方式使用
xsi:type
,会破坏XSD表达您希望文档满足的约束的完整性。(您的合作伙伴有理由不满意。)最好避免使用诸如
object
之类的通用元素名称,这样您就可以更好地直接在XSD中基于元素名称约束内容模型。