XML Schema有点复杂的记录

时间:2009-08-15 13:11:10

标签: xml xsd

我在为此XML构建架构时遇到问题:

<record>
    <field index="1">data</field>
    <field index="2">data</field>
    <field index="3">data</field>
    <field index="4">data</field>
    <field index="5">data</field>
    <field index="6">data</field>
    <group index="7">
        <member index="1">data</member>
        <member index="2">data</member>
    </group>
    <field index="8">data</field>
    <field index="9">data</field>
    <group index="10">
        <member index="1">data</member>
    </group>
    <field index="11">data</field>
    <field index="12">data</field>
    <field index="13">data</field>
    <field index="14">data</field>
    <field index="15">data</field>
    <field index="16">data</field>
    <field index="17">data</field>
</record>

问题在于,我不知道为“field”元素构建模式,我有许多具有相同名称“field”但具有不同属性“index”的元素。

此外,我在为标记组内的多个值构建架构时遇到问题。

2 个答案:

答案 0 :(得分:0)

欢迎,对于field,您可以按照以下方式定义:

<xsd:element name="field" type="FieldType"/>
<xsd:complexType name="FieldType>
  <xsd:simpleContent>
    <xsd:extension base="xsd:string">
      <xsd:attribute name="index" type="xsd:integer" />
    </xsd:extension>
  </xsd:simpleContent>
</xsd:complexType>

对于group,您必须使用sequence

<xsd:element name="group" type="GroupType" />
<xsd:complexType name="GroupType">
  <xsd:sequence>
    <xsd:element name="member" type="MemberType" minOccurs="1" maxOccurs="unbounded" />
  </xsd:sequence>
  <xsd:attribute name="index" type="xsd:integer" />
</xsd:complexType>

我认为每个member必须至少有一个group。此外,您应该定义MemberType。我省略了它,因为它几乎与上面提到的FieldType相同。

答案 1 :(得分:0)

您刚刚发现为什么这对于架构来说是一个糟糕的设计。无法将类型与索引相关联。您应该具有单独的元素名称,具有单独的类型。例如:

<person xsi:noNamespaceSchemaLocation="Person.xsd" 
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <name>
        <first>John</first>
        <last>Saunders</last>
    </name>
    <dob>1967-08-13</dob>
    <email>john.saunders@guess.com</email>
</person>

可能来自以下架构:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
     elementFormDefault="qualified" attributeFormDefault="unqualified">
    <xs:element name="person">
        <xs:annotation>
            <xs:documentation>A person</xs:documentation>
        </xs:annotation>
        <xs:complexType>
            <xs:sequence>
                <xs:element name="name">
                    <xs:complexType>
                        <xs:sequence>
                            <xs:element name="first" type="xs:string"/>
                            <xs:element name="last" type="xs:string"/>
                        </xs:sequence>
                    </xs:complexType>
                </xs:element>
                <xs:element name="dob" type="xs:date"/>
                <xs:element name="email">
                    <xs:simpleType>
                        <xs:restriction base="xs:token"/>
                    </xs:simpleType>
                </xs:element>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>

这种事情可以将特定元素限制为特定数据类型等等。你所拥有的东西不能限制特定元素的类型,因为它们都需要支持任何数据类型。