如何根据属性值确定XML元素的子元素

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何根据属性值确定XML元素的子元素相关的知识,希望对你有一定的参考价值。

我正在使用Eclipse IDE构建一个XML Schema以供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模式实现目的?

答案

显示您获得的验证错误会有很大帮助。我只能假设你在两个选项中都有相同的元素名称testElChild

要修复它,我建议您遵循编写XML模式的两个最佳实践:

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

一开始可能很乏味,但从长远来看,你会遇到一些麻烦。如果您在根据这些实践编写XSD时遇到问题,请告诉我们。

以上是关于如何根据属性值确定XML元素的子元素的主要内容,如果未能解决你的问题,请参考以下文章

通过属性值访问 xml 元素

如何根据 CSS 确定 SVG 元素的实际属性

XPath 根据子项的子值选择元素

jquery中如何获取当前DOM对象里的子元素?

如何使用 selenium webdriver、NUnit 和 C# 获取元素属性的子属性值

layui 获取节点元素返回的值为什么是undefined?