如何将类型设置为xs:any OR元素没有名称

时间:2016-11-08 16:05:09

标签: xml xsd

我有这个xml:

<hierarchy>
    <unix launcher="LauncherUnix">
        <linux/>
        <aix/>
    </unix>
    <bdd>
        <oracle launcher="LauncherOracle"/>
        <mysql launcher="LauncherMySQL"/>
    </bdd>
</hierarchy>

这是一个简单的树,我想用xsd验证它。主要方案是根元素名称hierarchy,之后我只有几个名称可以具有属性launcher的标记。

我尝试将类型设置为xs:any,如下所示:

<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="hierarchy" type="nodeHierarchy"/>

    <xs:complexType name="nodeHierarchy">
        <xs:sequence minOccurs="0" maxOccurs="unbounded">
            <xs:any type="nodeHierarchy"/>
        </xs:sequence>
        <xs:attribute name="launcher" use="optional"/>
    </xs:complexType>

</xs:schema>

但是我收到错误,因为xs:any不能有类型。在此之后,我尝试使用xs:any更改xs:element,如下所示:

<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="hierarchy" type="nodeHierarchy"/>

    <xs:complexType name="nodeHierarchy">
        <xs:sequence minOccurs="0" maxOccurs="unbounded">
            <xs:element type="nodeHierarchy"/>
        </xs:sequence>
        <xs:attribute name="launcher" use="optional"/>
    </xs:complexType>

</xs:schema>

问题是xs:element必须有一个名字。

是否有可能让一个简单的xsd解决这个问题?

1 个答案:

答案 0 :(得分:1)

  

是否有可能让一个简单的xsd解决这个问题?

简单?不可以。但替换组可以实现。

你基本上想要的是拥有某些类型(可能是子类型)但不同名称的元素。

定义所需类型的抽象元素:

<xsd:element name="_node" type="nodeHierarchy" abstract="true"/>

您可以在复杂类型中引用此元素:

<xsd:complexType name="nodeHierarchy">
    <xsd:sequence>
        <xsd:element ref="_node" minOccurs="0" maxOccurs="unbounded"/>
    </xsd:sequence>
    <xsd:attribute name="launcher" use="optional"/>
</xsd:complexType>

然后定义可以替换_node的元素:

<xsd:element name="oracle" type="nodeHierarchy" substitutionGroup="_node"/>
<xsd:element name="mysql" type="nodeHierarchy" substitutionGroup="_node"/>

现在,这些元素可以替换使用它的所有地方_node

从我的角度来看,这不是最好的架构设计。不要在XML元素名称中实现业务逻辑。