用于相同类型集合的xml架构

时间:2013-08-27 08:29:45

标签: xml xsd

以下实例的最简单架构是什么:

<blocks>
  <block id="1" current="true">ecf1923</block>
  <block id="2">acb79e1</block>
  <block id="3">223a431</block>
</blocks>

编辑:这是我去的地方......

<xs:schema>
      <xs:complexType name="BlockType">
        <xs:attribute name="id" type="xs:integer" use="required"/>
        <xs:attribute name="current" type="xs:boolean" use="optional"/>
      </xs:complexType>

      <xs:complexType name="BlockCollection">
        <xs:sequence>
          <xs:element name="block" type="BlockType" minOccurs="1" maxOccurs="unbounded"/>
        </xs:sequence>
      </xs:complexType>

      <xs:element name="blocks" type="BlockCollection"/>
</xs:schema>

我很好奇是否有更简单的方法可以达到同样的效果。

1 个答案:

答案 0 :(得分:1)

“最简单”的意思非常相对。

可能会跟随

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
    <xs:element name="blocks">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="block" maxOccurs="unbounded">
                    <xs:complexType>
                        <xs:simpleContent>
                            <xs:extension base="xs:string">
                                <xs:attribute name="id" type="xs:int" use="required"/>
                                <xs:attribute name="current" type="xs:boolean"/>
                            </xs:extension>
                        </xs:simpleContent>
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>

您可能需要以这种方式定义它,以便能够在模式的其他部分中重用某些类型。

<?xml version="1.0" encoding="UTF-8"?>
  <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
    <xs:element name="blocks" type="blocks_type"/>
    <xs:complexType name="blocks_type">
        <xs:sequence>
            <xs:element name="block" type="block_type" maxOccurs="unbounded"/>
        </xs:sequence>
    </xs:complexType>
    <xs:complexType name="block_type">
        <xs:simpleContent>
            <xs:extension base="xs:string">
                <xs:attribute name="id" type="xs:int" use="required"/>
                <xs:attribute name="current" type="xs:boolean"/>
            </xs:extension>
        </xs:simpleContent>
    </xs:complexType>
</xs:schema>

但您也可能需要限制“block”元素的内容,例如

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
    <xs:element name="blocks" type="blocks_type"/>
    <xs:simpleType name="block_content_type">
        <xs:restriction base="xs:string">
            <xs:pattern value="[0-9a-f]{7}" />
        </xs:restriction>
    </xs:simpleType>
    <xs:complexType name="blocks_type">
        <xs:sequence>
            <xs:element name="block" type="block_type" maxOccurs="unbounded"/>
        </xs:sequence>
    </xs:complexType>
    <xs:complexType name="block_type">
        <xs:simpleContent>
            <xs:extension base="block_content_type">
                <xs:attribute name="id" type="xs:int" use="required"/>
                <xs:attribute name="current" type="xs:boolean"/>
            </xs:extension>
        </xs:simpleContent>
    </xs:complexType>
</xs:schema>

您还可以要求将“id”属性作为键(因此也是唯一的):

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
    <xs:element name="blocks" type="blocks_type">
        <xs:key name="id_key">
            <xs:selector xpath="block" />
            <xs:field xpath="@id" />
        </xs:key>
    </xs:element>
    <xs:simpleType name="block_content_type">
        <xs:restriction base="xs:string">
            <xs:pattern value="[0-9a-f]{7}" />
        </xs:restriction>
    </xs:simpleType>
    <xs:complexType name="blocks_type">
        <xs:sequence>
            <xs:element name="block" type="block_type" maxOccurs="unbounded" />
        </xs:sequence>
    </xs:complexType>
    <xs:complexType name="block_type">
        <xs:simpleContent>
            <xs:extension base="block_content_type">
                <xs:attribute name="id" type="xs:int" use="required"/>
                <xs:attribute name="current" type="xs:boolean"/>
            </xs:extension>
        </xs:simpleContent>
    </xs:complexType>
</xs:schema>

等。等

有关您的请求的更多信息,您可以获得更具体的答案。