为什么这个Schema不会验证这个XML文件?

时间:2010-04-12 15:42:11

标签: validation xsd

XML文件:

<Lista count="3">
  <Pelicula nombre="Jurasic Park 3">
    <Genero>Drama</Genero>
    <Director sexo="M">Esteven Spielberg</Director>
    <Temporada>
       <Anho>2002</Anho>
       <Semestre>Verano</Semestre>
    </Temporada>
  </Pelicula>
  <Pelicula nombre="Maldiciones">
    <Genero>Ficcion</Genero>
    <Director sexo="M">Pedro Almodovar</Director>
    <Temporada>
       <Anho>2002</Anho>
       <Semestre>Verano</Semestre>
    </Temporada>
  </Pelicula>
  <Pelicula nombre="Amor en New York">
    <Genero>Romance</Genero>
    <Director sexo="F">Katia Hertz</Director>
    <Temporada>
       <Anho>2002</Anho>
       <Semestre>Verano</Semestre>
    </Temporada>
  </Pelicula>
</Lista>

这是我制作的XML Schema文件,它不起作用。 :\

<xsd:complexType name="Lista">
  <xsd:attribute name="count" type="xsd:integer" />
  <xsd:complexContent>
    <xsd:element name="Pelicula" type="xsd:string">
      <xsd:attribute name="nombre" type="xsd:string" />
      <xsd:complexType>
        <xsd:sequence>
          <xsd:element name="Genero" type="generoType"/>
          <xsd:element name="Director" type="directorType">
            <xsd:attribute name="sexo" type="sexoType"/>
          </xsd:element>
          </xsd:element name="Temporada">
           <xsd:complexType>
             <xsd:sequence>
               <xsd:element name="Anho" type="anhoType" />
               <xsd:element name="Semestre" type="semestreType" />
             </xsd:sequence>
           </xsd:complexType>
          <xsd:element></xsd:element>
        </xsd:sequence>
      </xsd:complexType>
    </xsd:element>
  </xsd:complexContent>
</xsd:complexType>

<xsd:simpleType name="sexoType">
  <xsd:restriction base="xsd:string">
    <xsd:enumeration value="F"/>
    <xsd:enumeration value="M"/>
  </xsd:restriction>
</xsd:simpleType>

<xsd:simpleType name="directorType">
  <xsd:restriction base="xsd:string" />
</xsd:simpleType>

<xsd:simpleType name="generoType">
  <xsd:restriction base="xsd:string">
    <xsd:enumeration value="Drama"/>
    <xsd:enumeration value="Accion"/>
    <xsd:enumeration value="Romance"/>
    <xsd:enumeration value="Ficcion"/>
  </xsd:restriction>
</xsd:simpleType>

<xsd:simpleType name="semestreType">
  <xsd:restriction base="xsd:string">
    <xsd:enumeration value="Verano"/>
    <xsd:enumeration value="Invierno"/>
  </xsd:restriction>
</xsd:simpleType>

<xsd:simpleType name="anhoType">
  <xsd:restriction base="xsd:integer">
    <xsd:minInclusive value="1970"/>
    <xsd:maxInclusive value="2020"/>
  </xsd:restriction>
</xsd:simpleType>

2 个答案:

答案 0 :(得分:1)

尝试单独声明和使用您的类型。这使得XSD更长一点,但嵌套更少,更易读(也更可重用):

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

  <!-- document element -->
  <xs:element name="Lista" type="listaType" />

  <!-- type definitions -->
  <xs:complexType name="listaType">
    <xs:sequence>
      <xs:element name="Pelicula" type="peliculaType" minOccurs="0" maxOccurs="unbounded" />
    </xs:sequence>
    <xs:attribute name="count" type="countType" />
  </xs:complexType>

  <xs:complexType name="peliculaType">
    <xs:all>
      <xs:element name="Genero" type="generoType" />
      <xs:element name="Director" type="directorType" />
      <xs:element name="Temporada" type="temporadaType" />
    </xs:all>
    <xs:attribute name="nombre" type="xs:string" />
  </xs:complexType>

  <xs:complexType name="directorType">
    <xs:simpleContent>
      <xs:extension base="xs:string">
        <xs:attribute name="sexo" type="sexoType" />
      </xs:extension>
    </xs:simpleContent> 
  </xs:complexType>

  <xs:complexType name="temporadaType">
    <xs:all>
      <xs:element name="Anho" type="anhoType" />
      <xs:element name="Semestre" type="semestreType" />
    </xs:all>
  </xs:complexType>

  <xs:simpleType name="sexoType">
    <xs:restriction base="xs:string"> 
      <xs:enumeration value="F" /> 
      <xs:enumeration value="M" /> 
    </xs:restriction> 
  </xs:simpleType>

  <xs:simpleType name="generoType"> 
    <xs:restriction base="xs:string"> 
      <xs:enumeration value="Drama" /> 
      <xs:enumeration value="Accion" /> 
      <xs:enumeration value="Romance" /> 
      <xs:enumeration value="Ficcion" /> 
    </xs:restriction> 
  </xs:simpleType>

  <xs:simpleType name="semestreType"> 
    <xs:restriction base="xs:string"> 
      <xs:enumeration value="Verano" /> 
      <xs:enumeration value="Invierno" /> 
    </xs:restriction> 
  </xs:simpleType>

  <xs:simpleType name="anhoType">
    <xs:restriction base="xs:integer"> 
      <xs:minInclusive value="1970" /> 
      <xs:maxInclusive value="2020" /> 
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="countType">
    <xs:restriction base="xs:integer">
      <xs:minInclusive value="0" />
    </xs:restriction>
  </xs:simpleType>

</xs:schema>

以上验证了您的输入XML。

请注意:

  • XML Schema名称空间前缀的约定是xs(AFAIK - 如果您愿意,您仍然可以继续使用xsd
  • count属性实际上是不必要的,因为计数可以a)容易计算,b)当count属性值和实际计数有所不同时,存在出现问题的风险原因。可以从数据中导出的东西永远不应该是数据的一部分。

哦,回答你的初步问题(为什么我的工作无效):

  • 您永远不会声明实际的文档元素(“Lista”),只需声明其类型即可。与我的解决方案比较。
  • complexType name="Lista"中:
    • attribute不能是复杂类型的第一个孩子。必须在其他所有内容之后将属性声明为
    • complexContent不能包含element
    • 实际上,您根本不需要complexContent - 只需使用sequence
  • element name="Pelicula"中:
    • 当您在{/ 1}}内声明type时,complexType属性是非法的
  • complexType "Pelicula"中:
    • 再次,属性持续。
    • 请勿使用sequence,除非您想让其他任何儿童订单非法。在这种类型的文件中,我猜想儿童的顺序是无关紧要的。
  • element name="Director"中:
    • 您已宣布type时无法声明任何属性。在sexo
    • 中加入directorType属性
  • simpleType name="directorType"中:
    • 实际上,这应该是包含complexType simpleContent的{​​{1}}。这样您就可以添加extension属性
  • 您的XSD甚至没有格式良好的XML。
  • 您的XML 的格式也不正确。我已将其修复为能够首先进行测试。

P.S。:有足够的XSD文档可以解决您遇到的许多基本问题。网上有XSD验证器可以帮助您告诉您哪些结构是非法的。知道一切绝对没有必要,但是一点点阅读+反复试验会有所帮助。 ; - )

答案 1 :(得分:0)

首先:

         <Semestre>Verano<Semestre>

......看起来不太好。