验证重复的可选元素XML-Schema

时间:2013-01-15 11:42:41

标签: xsd

我尝试创建一个验证以下xml的xsd架构:

<results>
<row>
    <PersonID key="true">1</PersonID> 
    <FirstName>John</FirstName> 
    <Surname>Smith</Surname> 
    <LogonName>jsmith</LogonName> 
</row>
<row>
    <PersonID key="true">2</PersonID> 
    <FirstName>Steve</FirstName> 
    <Surname>Jones</Surname> 
    <LogonName>sjones</LogonName> 
</row>

结果节点和行节点是必需的,但每行内的节点都是可选的,可能还有其他未列出的节点。可能有1行或多行。

我创建了以下内容,但我无法正确验证:

<xs:element name="results">
<xs:complexType>
  <xs:sequence>
    <xs:element name="row" maxOccurs="unbounded" minOccurs="0">
      <xs:complexType>
        <xs:sequence>
          <xs:element name="PersonID" minOccurs="0">
            <xs:complexType>
              <xs:simpleContent>
                <xs:extension base="xs:byte">
                  <xs:attribute type="xs:string" name="key" use="optional"/>
                </xs:extension>
              </xs:simpleContent>
            </xs:complexType>
          </xs:element>
          <xs:choice minOccurs="0">
            <xs:element type="xs:string" name="FirstName" minOccurs="0"/>
            <xs:element type="xs:string" name="Surname" minOccurs="0"/>
            <xs:element type="xs:string" name="LogonName" minOccurs="0"/>
            <xs:element type="xs:string" name="GroupName" minOccurs="0"/>
          </xs:choice>
        </xs:sequence>
      </xs:complexType>
    </xs:element>
  </xs:sequence>
</xs:complexType>

感谢。

1 个答案:

答案 0 :(得分:0)

如果PersonIDFirstName等最多只能出现一次 - 按照特定顺序 - 请尝试以下操作:

<xs:element name="results">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="row" maxOccurs="unbounded" minOccurs="0">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="PersonID" minOccurs="0">
              <xs:complexType>
                <xs:simpleContent>
                  <xs:extension base="xs:byte">
                    <xs:attribute type="xs:string" name="key" use="optional"/>
                  </xs:extension>
                </xs:simpleContent>
              </xs:complexType>
            </xs:element>
            <xs:element type="xs:string" name="FirstName" minOccurs="0"/>
            <xs:element type="xs:string" name="Surname" minOccurs="0"/>
            <xs:element type="xs:string" name="LogonName" minOccurs="0"/>
            <xs:element type="xs:string" name="GroupName" minOccurs="0"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
    </xs:sequence>
  </xs:complexType>
</xs:element>

(基本上只删除choice元素)。如果PersonIDFirstName等最多只能出现一次,但您可以按任意顺序使用all

<xs:element name="results">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="row" maxOccurs="unbounded" minOccurs="0">
        <xs:complexType>
          <xs:all>
            <xs:element name="PersonID" minOccurs="0">
              <xs:complexType>
                <xs:simpleContent>
                  <xs:extension base="xs:byte">
                    <xs:attribute type="xs:string" name="key" use="optional"/>
                  </xs:extension>
                </xs:simpleContent>
              </xs:complexType>
            </xs:element>
            <xs:element type="xs:string" name="FirstName" minOccurs="0"/>
            <xs:element type="xs:string" name="Surname" minOccurs="0"/>
            <xs:element type="xs:string" name="LogonName" minOccurs="0"/>
            <xs:element type="xs:string" name="GroupName" minOccurs="0"/>
          </xs:all>
        </xs:complexType>
      </xs:element>
    </xs:sequence>
  </xs:complexType>
</xs:element>

如果您不知道row中可能出现的元素,您可以使用:

<xs:element name="results">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="row" maxOccurs="unbounded" minOccurs="0">
        <xs:complexType>
          <xs:sequence>
            <xs:any minOccurs="0" maxOccurs="unbounded" processContents="skip"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
    </xs:sequence>
  </xs:complexType>
</xs:element>

接受row中的任何元素。