如何根据属性值确定 XML 元素的子元素
How to Determine XML Element's Children Based on Value of Attribute
我正在使用 Eclipse IDE 构建一个 XML 模式供 JAXB 处理,但我收到以下验证错误:
<xsd:element name="testEl">
<xsd:complexType>
<xsd:choice>
<xsd:sequence>
<xsd:element name="testElChild">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="tec1"/>
<xsd:element name="tec2"/>
</xsd:sequence>
<xsd:attribute name="type" use="required" fixed="yes"/>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
<xsd:sequence>
<xsd:element name="testElChild">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="tec3"/>
<xsd:element name="tec4"/>
</xsd:sequence>
<xsd:attribute name="type" use="required" fixed="no"/>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:choice>
</xsd:complexType>
</xsd:element>
基本上,我试图指定如果元素 testElChild
的类型属性的值为 "yes" 那么它应该包含子元素 tec1
和 tec2
,但如果 type 属性的值为 "no",那么它应该包含子元素 tec3
和 tec4
.
上述架构有什么问题 and/or 我该如何使用有效的 XML 架构来实现目标?
如果您显示您得到的验证错误,将会很有帮助。我只能假设您在两个选项中具有相同的元素名称 testElChild
。
要修复它,我建议您在编写 XML 模式时遵循两个最佳实践:
- Avoid anonymous types:如果您从命名类型开始而不是匿名类型,则更容易排除故障;然后,当一切正常并且您仍然确定要使用匿名类型时,您可以使用匿名类型进行翻译(如果只使用一次);
- Use polymorphism instead of xsd:choice:例如,您定义了一个抽象类型
TestElChild
,并且每个选择都有一个扩展类型,例如NoTypeTestElChild
和 YesTypeTestElChild
.
一开始可能会很乏味,但从长远来看会给你带来一些麻烦。如果您在根据这些做法编写 XSD 时遇到问题,请告诉我们。
我正在使用 Eclipse IDE 构建一个 XML 模式供 JAXB 处理,但我收到以下验证错误:
<xsd:element name="testEl">
<xsd:complexType>
<xsd:choice>
<xsd:sequence>
<xsd:element name="testElChild">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="tec1"/>
<xsd:element name="tec2"/>
</xsd:sequence>
<xsd:attribute name="type" use="required" fixed="yes"/>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
<xsd:sequence>
<xsd:element name="testElChild">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="tec3"/>
<xsd:element name="tec4"/>
</xsd:sequence>
<xsd:attribute name="type" use="required" fixed="no"/>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:choice>
</xsd:complexType>
</xsd:element>
基本上,我试图指定如果元素 testElChild
的类型属性的值为 "yes" 那么它应该包含子元素 tec1
和 tec2
,但如果 type 属性的值为 "no",那么它应该包含子元素 tec3
和 tec4
.
上述架构有什么问题 and/or 我该如何使用有效的 XML 架构来实现目标?
如果您显示您得到的验证错误,将会很有帮助。我只能假设您在两个选项中具有相同的元素名称 testElChild
。
要修复它,我建议您在编写 XML 模式时遵循两个最佳实践:
- Avoid anonymous types:如果您从命名类型开始而不是匿名类型,则更容易排除故障;然后,当一切正常并且您仍然确定要使用匿名类型时,您可以使用匿名类型进行翻译(如果只使用一次);
- Use polymorphism instead of xsd:choice:例如,您定义了一个抽象类型
TestElChild
,并且每个选择都有一个扩展类型,例如NoTypeTestElChild
和YesTypeTestElChild
.
一开始可能会很乏味,但从长远来看会给你带来一些麻烦。如果您在根据这些做法编写 XSD 时遇到问题,请告诉我们。