这是迄今为止最可怕的问题标题,但我希望有人有时间在它关闭之前回答。
编辑:更改了标题。 编辑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>
我感兴趣
答案 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:包含一个模块,该模块将每个允许的元素名称定义为该替换组的成员,并且只要名称列表发生更改,您就可以更改该包含的模块;如果合适,您可以从以任何方便的形式保存的列表中生成模块。