Почему эта схема не проверяет этот XML-файл? - PullRequest
1 голос
/ 12 апреля 2010

Файл 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>

Ответы [ 2 ]

1 голос
/ 12 апреля 2010

Попробуйте объявить и использовать ваши типы отдельно. Это делает 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 и фактическое количество по какой-то причине различаются. Вещи, которые можно извлечь из данных, никогда не должны быть частью данных.

Да, и ответить на ваш первоначальный вопрос (почему мой не работает):

  • Вы никогда не объявляете фактический элемент документа ("Lista"), вы просто объявляете его тип. Сравните с моим решением.
  • В complexType name="Lista":
    • attribute не может быть первым потомком сложного типа. Атрибуты должны быть объявлены после всего остального.
    • complexContent не может содержать element.
    • , вам вообще не нужно complexContent - просто используйте sequence.
  • В element name="Pelicula":
    • Атрибут type недопустим, когда вы объявляете complexType в пределах.
  • В complexType для "Pelicula":
    • Опять же, последние атрибуты.
    • Не используйте sequence, если вы не хотите, чтобы любой другой заказ детей был незаконным. В этом типе документа я бы предположил, что детский порядок не имеет значения.
  • В element name="Director":
    • Вы не можете объявить какие-либо атрибуты с тех пор, как вы уже объявили type. Включите атрибут sexo в directorType
  • В simpleType name="directorType":
    • В действительности это должен быть complexType, содержащий simpleContent с extension. Таким образом, вы можете включить атрибут sexo
  • Ваш XSD даже не является правильно сформированным XML.
  • Ваш XML является также не был правильно сформирован. Я исправил это, чтобы иметь возможность проверить в первую очередь.

P.S .: Существует достаточно свободно доступной документации по XSD, чтобы исправить многие из ваших основных проблем. В сети есть валидаторы XSD, которые помогают вам сообщать, какие конструкции являются незаконными. Знание всего абсолютно не обязательно, но небольшое чтение + проб и ошибок помогло бы. ; -)

0 голосов
/ 12 апреля 2010

Для начала:

         <Semestre>Verano<Semestre>

... не очень хорошо выглядит.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...