1

我正在尝试创建一个验证以下 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>

谢谢。

4

1 回答 1

0

如果PersonID, FirstNameetc. 最多可以发生一次 - 并且按照特定的顺序 - 试试这个:

<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元素)。IfPersonIDFirstName最多只能发生一次,但您可以使用任何顺序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.

于 2013-01-15T13:02:44.383 回答