2010-04-12 8 views
1

XML 파일 : 여기이 스키마가이 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 스키마 파일입니다. : \ 시작에 대한

<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> 

답변

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 스키마 네임 스페이스 접두사에 대한 규칙은 xs입니다 (AFAIK - 당신은 여전히 ​​가서 원하는 경우 xsd을 사용할 수 있습니다).
  • 수는 쉽게 계산할 수 있기 때문에 count 속성은 실제로 필요하지 않습니다. 그리고 어떤 이유로 인해 count 속성 값과 실제 수가 다를 때 무언가 잘못 될 위험이 있습니다. 데이터에서 파생 가능한 것은 데이터의 일부가 될 수 없습니다.

아, 그리고 당신의 처음 질문 (왜 광산이 작동하지 않습니다) 대답하기 :

  • 당신은 실제 문서 요소 ("챠트")를 선언하지, 당신은 단지 유형을 선언합니다. 내 솔루션과 비교하십시오. complexType name="Lista"에서
  • 는 :
    • attribute 은 복잡한 유형의 첫 번째 자식이 될 수 없습니다. 속성은 이후에 으로 선언되어야합니다.
    • complexContent에는 element을 포함 할 수 없습니다.
    • 실제로 complexContent이 필요하지 않습니다. 대신 sequence을 사용하면됩니다. element name="Pelicula"에서
  • : 당신이 내 complexType를 선언 할 때
    • type 속성은 불법입니다. 에서
  • 는이 complexType"Pelicula"을 위해 : 다시
    • , 마지막 속성.
    • 다른 어린이 주문을 불법으로 만들고 싶지 않으면 sequence을 사용하지 마십시오. 이런 유형의 문서에서 나는 자식 순서가 무의미하다고 생각할 것이다.element name="Director"에서
  • :
    • 당신은 이미 type을 선언 한 이후 어떤 속성을 선언 할 수 없습니다.
      • 이 현실에 extensionsimpleContent를 포함하는 complexType해야한다 : simpleType name="directorType"에서 directorType
    • 에서 sexo 속성을 포함합니다. 이 방법을 사용하면 sexo 속성을 포함 할 수 있습니다.
  • XSD는 XML 형식이 아닙니다.
  • 귀하의 XML 인 경우 잘 형성되지 않았습니다. 나는 처음부터 테스트 할 수 있도록 그것을 고쳤다.

추신 : 많은 기본 문제를 해결할 수있는 충분한 XSD 설명서가 무료로 제공됩니다. 인터넷에는 XSD 검사기가있어 어떤 구조가 불법인지를 알려줍니다. 을 알면은 꼭 필요한 것은 아니지만 약간의 읽기 + 시행 착오가 도움이되었을 것입니다. ;-)

+0

큰 제안; 시간 내 주셔서 대단히 감사합니다. –

+0

@ 수르지 오 : 오신 것을 환영합니다. ;-) P.S. : 비판을 너무 개인적으로 받아들이지 않았기를 바랍니다. 그것에 대해 생각하고, 나는 그것을 제거 할 것입니다. 내 말을 들어 봤어. ;-) – Tomalak

+0

아니요 제발하지 마십시오. 하나는 당신보다 나은 사람들 에게서만 배웁니다. 나는 오직 내 질문에 답하는 모든 사람들이 당신처럼 나를 비판하기를 바랄뿐입니다. –

0

:

  <Semestre>Verano<Semestre> 

... 잘 형성 보이지 않는다.

+0

@fd : ​​OP의 의도가 무엇인지에 대한 입력을 수정했습니다. – Tomalak

+0

예, 약간 돌진했지만 놓치기 쉬운 오류를 발견했습니다. 공 굴러 가려고. 당신의 대답은 훌륭합니다. +1 –

관련 문제