Xml 如何在xsd:choice元素中定义几个名称相同但类型不同的元素?

Xml 如何在xsd:choice元素中定义几个名称相同但类型不同的元素?,xml,xsd,Xml,Xsd,是否可以以某种方式定义一个xsd方案来验证此类xml: <item_list> <item ItemType="SimpleMessage" Caption="Simplest message"/> <item ItemType="ComplexMessage" SomeAttr="value"> <item_data>some text</item_data> </item> </item_lis

是否可以以某种方式定义一个xsd方案来验证此类xml:

<item_list>
  <item ItemType="SimpleMessage" Caption="Simplest message"/>
  <item ItemType="ComplexMessage" SomeAttr="value">
    <item_data>some text</item_data>
  </item>
</item_list>

一些文本
问题是我没有找到任何可能定义smth,比如:

  <xsd:element name="Items">
      <xsd:complexType>
        <xsd:choice>
          <xsd:element name="item" type="SimpleMessType"/>
          <xsd:element name="item" type="ComplexMessType"/>
        </xsd:choice>
      </xsd:complexType>
  </xsd:element>


但是我需要检查SimpleMessage是否没有子元素或附加属性:(

您不能使用您建议的模式结构来执行此操作,因为该结构违反了XML模式歧义规则

一个可能的选择是定义一个超类型,比如说
BaseElement
,它是空的,然后是子类型,并使用
xsi:type
来覆盖,而不仅仅是一个普通的
type
属性。可以找到关于如何工作的更多信息。


作为一种解决方法,您可以使用mixed=“true”将类型定义SimpleMessageType和ComplexMessType合并为单个类型--然后在模式处理完成后将您在自己的代码中收到的内容分离。请参阅stackoverflow讨论。

正如前面的答案所提到的,在XSD 1.0中,您可以很容易地使用
xsi:type
属性,而不是使用sa定义新的
ItemType
属性我的功能

XSD 1.1包含一个构造,旨在使人们更容易支持像这样的情况,无论出于何种原因,不想使用
xsi:type
这种方式:条件类型赋值。本质上,它允许元素声明具有简单的XPath/typename对序列;XPath表达式按顺序计算当计算结果为true时,元素与相应的类型相关联(第一种方法有助于在扫描遇到开始标记时立即知道用于验证元素的类型;第二种方法有助于保持验证上下文自由),因此基本上测试只能是对属性值的测试。您的示例可以这样编写:

<xs:element name="item">
  <xs:alternative test="@ItemType='SimpleMessage'" type="SimpleMessType"/>
  <xs:alternative test="@ItemType='SimpleMessage'" type="ComplexMessType"/>
  <xs:alternative type="xs:error"/>
</xs:element>

第三种选择确保必须遇到一种预期情况,元素才能有效。如果在这里省略了它,那么如果两个测试表达式都不是真的,那么元素将被指定为声明的
项类型,在这种情况下为
xs:anyType