如何在XML Schema中结合使用序列与无序子元素
解决方案
根据你的需求,要让graph元素内的id和name可任意顺序且必须存在,同时后续元素按指定顺序排列,可根据你使用的XSD版本选择以下方案:
方案一:XSD 1.0 兼容版
XSD 1.0允许在<xsd:sequence>中嵌套<xsd:all>(要求<xsd:all>内元素的maxOccurs为1),以此实现id和name的无序性,同时保证后续元素按顺序排列。修改后的Schema如下:
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <xsd:element name="graph" type="AType"/> <xsd:complexType name="AType"> <xsd:sequence> <!-- id和name可任意顺序,且必须存在 --> <xsd:all> <xsd:element name="id" type="xsd:string"/> <xsd:element name="name" type="xsd:string"/> </xsd:all> <!-- 后续元素严格按顺序排列 --> <xsd:element name="nodes" minOccurs="0"> <xsd:complexType> <xsd:sequence> <xsd:element name="node" maxOccurs="unbounded" minOccurs="0"> <xsd:complexType> <xsd:sequence> <xsd:element type="xsd:string" name="id"/> <xsd:element type="xsd:string" name="name"/> <xsd:any minOccurs="0"/> </xsd:sequence> </xsd:complexType> </xsd:element> </xsd:sequence> </xsd:complexType> </xsd:element> <xsd:element name="edges" minOccurs="0"> <xsd:complexType> <xsd:sequence> <xsd:element name="node" maxOccurs="unbounded" minOccurs="0"> <xsd:complexType> <xsd:sequence> <xsd:element type="xsd:string" name="id"/> <xsd:element type="xsd:string" name="from"/> <xsd:element type="xsd:string" name="to"/> </xsd:sequence> </xsd:complexType> </xsd:element> </xsd:sequence> </xsd:complexType> </xsd:element> </xsd:sequence> </xsd:complexType> </xsd:schema>
方案二:XSD 1.1 增强版
如果你的XSD处理器支持XSD 1.1,可利用其对<xsd:all>的宽松限制,直接在<xsd:all>内部嵌套<xsd:sequence>,更灵活地组织内容模型:
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xsd:version="1.1"> <xsd:element name="graph" type="AType"/> <xsd:complexType name="AType"> <xsd:all> <xsd:element name="id" type="xsd:string"/> <xsd:element name="name" type="xsd:string"/> <!-- 将需顺序排列的元素封装在sequence中 --> <xsd:sequence> <xsd:element name="nodes" minOccurs="0"> <xsd:complexType> <xsd:sequence> <xsd:element name="node" maxOccurs="unbounded" minOccurs="0"> <xsd:complexType> <xsd:sequence> <xsd:element type="xsd:string" name="id"/> <xsd:element type="xsd:string" name="name"/> <xsd:any minOccurs="0"/> </xsd:sequence> </xsd:complexType> </xsd:element> </xsd:sequence> </xsd:complexType> </xsd:element> <xsd:element name="edges" minOccurs="0"> <xsd:complexType> <xsd:sequence> <xsd:element name="node" maxOccurs="unbounded" minOccurs="0"> <xsd:complexType> <xsd:sequence> <xsd:element type="xsd:string" name="id"/> <xsd:element type="xsd:string" name="from"/> <xsd:element type="xsd:string" name="to"/> </xsd:sequence> </xsd:complexType> </xsd:element> </xsd:sequence> </xsd:complexType> </xsd:element> </xsd:sequence> </xsd:all> </xsd:complexType> </xsd:schema>
说明
- 方案一严格遵循XSD 1.0规范,确保
id和name在nodes、edges之前,且二者顺序不限; - 方案二基于XSD 1.1,允许
id、name与nodes、edges组的顺序任意(若你需要这种灵活性),同时保证nodes、edges内部的顺序。
内容的提问来源于stack exchange,提问作者Learner
相关产品推荐
相关产品推荐

