如何基于属性值确定XML元素的子元素

时间:2018-08-31 13:50:29

标签: xml xsd jaxb xml-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的type属性的值为“ yes”,则它应包含子元素tec1tec2,但是如果type属性的值为“ no”,则它应包含子元素tec3tec4

上述架构有什么问题和/或如何通过有效的XML架构实现目标?

1 个答案:

答案 0 :(得分:1)

显示验证错误将对您有很大帮助。我只能假设您在两个选择中都拥有相同的元素名称testElChild

要解决此问题,建议您遵循两种最佳实践来编写XML模式:

  • Avoid anonymous types:如果从命名类型而不是匿名类型开始,则更容易进行故障排除;然后,当一切正常并且仍然​​确定要使用匿名类型时,可以转换为匿名类型(如果仅使用一次);
  • Use polymorphism instead of xsd:choice:例如,您定义了一种抽象类型TestElChild,并为每个选择定义了一个扩展类型,例如NoTypeTestElChildYesTypeTestElChild

起初可能很乏味,但从长远来看会给您带来一些麻烦。如果您在根据这些做法编写XSD时遇到问题,请告诉我们。