我有这个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解决这个问题?
答案 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元素名称中实现业务逻辑。