【问题标题】:Validate repeating optional elements XML-Schema验证重复的可选元素 XML-Schema
【发布时间】:2012-12-29 12:08:44
【问题描述】:

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

谢谢。

【问题讨论】:

  • 请参阅下面的可能答案,但我不确定您所说的“他们可能还有其他未列出的节点”是什么意思

标签: xsd


【解决方案1】:

如果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 中的任何元素。

【讨论】:

  • 在某些情况下,行中可能还有其他节点,例如 或 <initial> 等。有没有办法允许任何未知节点进行验证?</initial>
  • 是的,使用any(见扩展答案)——当然,此时验证非常弱:任何东西都可以放在row中。
猜你喜欢
  • 2021-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-22
  • 2011-12-19
  • 1970-01-01
  • 2013-03-22
  • 1970-01-01
相关资源
最近更新 更多