是否可以在XSD中定义一个元素,该元素在XML中可以有不同的名称,具体取决于它所代表的数据类型?

时间:2015-03-18 10:22:15

标签: xml xsd schema

这是迄今为止最可怕的问题标题,但我希望有人有时间在它关闭之前回答。

编辑:更改了标题。 编辑2:有约。 300种元件类型表。列表一直在变化。如果无法实现完全动态的方法,也可以接受字符串枚举,因为在此枚举中添加新表很容易,并且应该向后兼容。

客户希望我以xml:

的方式更改当前架构
/*0-n components, the outer xml is of no interest in this context */
<component table=ElectricalComponent>
   <id>3</id>
   <class>class1</class>
</component>
<component table=OtherKindOfComponent>
   <id>4</id>
   <class>class2</class>
</component>

看起来像这样:

<electricalcomponent>
   <id>3</id>
   <class>class1</class>
</electricalcomponent>
<otherkindofcomponent>
   <id>4</id>
   <class>class2</class>
</otherkindofcomponent>

我的架构定义如下:

<xs:complexType name="tComponent">
   <xs:sequence>
      <xs:element name="id" type="xs:int" minOccurs="0"/>
      <xs:element name="class" type="xs:string" minOccurs="0"/>
   </xs:sequence>
   <xs:attribute name="table" type="xs:string"/>
</xs:complexType>

<xs:element name="GetComponentResponse">
   <xs:complexType>
     <xs:sequence>
       <xs:element name="component" type="tComponent" />
     </xs:sequence>
   </xs:complexType>
</xs:element>

我感兴趣

  • 如果没有为每种组件类型定义复杂类型,是否可行? (我不会这样做,因为没有意义。)

2 个答案:

答案 0 :(得分:1)

你在这里:

<xs:element name="GetComponentResponse">
    <xs:complexType>
        <xs:sequence minOccurs="0" maxOccurs="unbounded">
            <xs:choice>
                <xs:element name="electricalcomponent" type="tComponent" />
                <xs:element name="otherkindofcomponent" type="tComponent" />
            </xs:choice>
        </xs:sequence>
    </xs:complexType>
</xs:element>

以上是您提到的输入的有效架构:

<electricalcomponent>
   <id>3</id>
   <class>class1</class>
</electricalcomponent>
<otherkindofcomponent>
   <id>4</id>
   <class>class2</class>
</otherkindofcomponent>

答案 1 :(得分:1)

不可能有一个静态模式来约束子元素的类型而不约束它们的名称。但架构是否必须是不可变的?您可以将Component作为替换组的头部,并且可以xs:包含一个模块,该模块将每个允许的元素名称定义为该替换组的成员,并且只要名称列表发生更改,您就可以更改该包含的模块;如果合适,您可以从以任何方便的形式保存的列表中生成模块。