Saltar al contenido principal

Ejercicio 421

Un cine utiliza un fichero XML para almacenar las películas que tiene en cartelera.

Para cada película, se guarda la siguiente información:

  • Código identificativo (atributo).
  • Duración (atributo).
  • Año de publicación (atributo).
  • Título de la película.
  • Título original, en el caso de la película sea extrangera.
  • País se producción.
  • Los géneros a los que pertenece.
  • Clasificación de edad o si está sin clasificar.
  • Sinopsis.
  • Director o directora.
  • Reparto (actores y actrices).
  • Web.
  • URL de IMDb.
  • Nombre del fichero que contiene el cartel de la película.
Documento XML

Ejemplo de documento XML que cumple los requisitos.

Escribe un XML Schema para validar el tipo de documento XML descrito, eligiendo los tipos de datos más apropiados y teniendo en cuenta que:

  • En cada documento, hay una película o más.
  • Los atributos codigo, duracion y ano son atributos obligatorios.
  • El atributo codigo es un identificador único en todo el documento.
  • Los elementos <titulo-original> y <web> son elementos opcionales. El resto son obligatorios.
  • En la lista de géneros, por lo menos, tiene que haber uno.
  • Si no se usa <clasificacion>, se debe utilizar <sin-clasificar />. Uno de ellos tiene que estar presente siempre, pero no pueden estarlo a la vez.
  • En el caso de estar presente <clasificacion>, el atributo edad es obligatorio.
  • El atributo edad es un valor numérico. Se utiliza 0 para indicar que es para todos los públicos.
  • El elemento <director> puede substituirse por <directora>, pero solo puede aparecer una vez cada uno y no simultáneamente.
  • El reparto está formado por actores y atrices. Como mínimo, debe haber un <actor> o <actriz>.
  • Los valores de <imdb> y web son URLs. Se debe validar que empiecen por http:// o https://. Es necesario tener en cuenta que se puede escribir en mayúsculas, minúsculas o de forma combinada (mezclando minúsculas con mayúsculas).
Solución
XML
<cartelera 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="421.xsd">
<pelicula codigo="film899895" duracion="192" ano="2022">
<titulo>Avatar: El sentido del agua</titulo>
<titulo-original>Avatar: The Way of Water</titulo-original>
<pais>Estados Unidos</pais>
<generos>
<genero>Ciencia ficción</genero>
<genero>Aventuras</genero>
<genero>Fantástico</genero>
<genero>Acción</genero>
</generos>
<clasificacion edad="12" />
<sinopsis>
Más de una década después de los acontecimientos de 'Avatar', los Na'vi Jake Sully, Neytiri y
sus hijos viven en paz en los bosques de Pandora hasta que regresan los hombres del cielo.
Entonces comienzan los problemas que persiguen sin descanso a la familia Sully, que decide
hacer
un gran sacrificio para mantener a su pueblo a salvo y seguir ellos con vida.
</sinopsis>
<director>James Cameron</director>
<reparto>
<actor>Sam Worthington</actor>
<actriz>Zoe Saldana</actriz>
<actriz>Sigourney Weaver</actriz>
<actriz>Kate Winslet</actriz>
<actor>Stephen Lang</actor>
<actor>Cliff Curtis</actor>
<actor>Joel David Moore</actor>
<actriz>Edie Falco</actriz>
</reparto>
<web>https://www.avatar.com/movies/avatar-the-way-of-water</web>
<imdb>https://www.imdb.com/title/tt1630029</imdb>
<cartel>avatar-the-way-of-water.jpg</cartel>
</pelicula>

<pelicula codigo="film929728" duracion="141" ano="2017">
<titulo>Wonder Woman</titulo>
<pais>Estados Unidos</pais>
<generos>
<genero>Fantástico</genero>
<genero>Acción</genero>
<genero>Bélico</genero>
<genero>Superhéroes</genero>
</generos>
<clasificacion edad="12" />
<sinopsis>
Antes de ser Wonder Woman (Gal Gadot) era Diana, princesa de las Amazonas, entrenada para ser
una guerrera invencible. Diana fue criada en una isla paradisíaca protegida. Hasta que un día
un piloto norteamericano (Chris Pine), que tiene un accidente y acaba en sus costas, le habla
de un gran conflicto existente en el mundo [Primera Guerra Mundial]. Diana decide salir de la
isla convencida de que puede detener la terrible amenaza. Mientras lucha junto a los hombres
en la guerra que acabará con todas las guerras, Diana descubre todos sus poderes y su
verdadero destino.
</sinopsis>
<directora>Patty Jenkins</directora>
<reparto>
<actriz>Gal Gadot</actriz>
<actor>Chris Pine</actor>
<actriz>Robin Wright</actriz>
<actriz>Lucy Davis</actriz>
<actriz>Connie Nielsen</actriz>
<actor>Danny Huston</actor>
<actor>David Thewlis</actor>
</reparto>
<imdb>https://www.imdb.com/title/tt0451279</imdb>
<cartel>wonder-woman.jpg</cartel>
</pelicula>

<pelicula codigo="film936995" duracion="125" ano="2004">
<titulo>Mar adentro</titulo>
<pais>España</pais>
<generos>
<genero>Drama</genero>
</generos>
<sin-clasificar />
<sinopsis>
Ramón (Javier Bardem) lleva casi treinta años postrado en una cama al cuidado de su familia.
Su única ventana al mundo es la de su habitación, que da al mar, donde sufrió el accidente que
interrumpió su juventud. Desde entonces, su único deseo es morir dignamente. En su vida
ejercen una gran influencia dos mujeres: Julia (Belén Rueda), una abogada que apoya su causa,
y Rosa (Lola Dueñas), una vecina que intenta convencerlo de que vivir merece la pena. Pero
también ellas, cautivadas por la luminosa personalidad de Ramón, se replantearán los
principios que rigen sus vidas. Él sabe que sólo quien de verdad le ame le ayudará a emprender
el último viaje.
</sinopsis>
<director>Alejandro Amenábar</director>
<reparto>
<actor>Javier Bardem</actor>
<actriz>Belén Rueda</actriz>
<actriz>Lola Dueñas</actriz>
<actriz>Mabel Rivera</actriz>
<actriz>Clara Segura</actriz>
<actor>Joan Dalmau</actor>
</reparto>
<imdb>https://www.imdb.com/title/tt0369702</imdb>
<cartel>mar-adento-2004.jpg</cartel>
</pelicula>
</cartelera>
421.xsd
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="cartelera" type="tCartelera" />

<xs:complexType name="tCartelera">
<xs:sequence>
<xs:element name="pelicula" type="tPelicula" maxOccurs="unbounded" />
</xs:sequence>
</xs:complexType>

<xs:complexType name="tPelicula">
<xs:sequence>
<xs:element name="titulo" type="xs:string" />
<xs:element name="titulo-original" type="xs:string" minOccurs="0" maxOccurs="1" />
<xs:element name="pais" type="xs:string" />
<xs:element name="generos" type="tGenero" />
<xs:choice>
<xs:element name="clasificacion" type="tClasificacion"/>
<xs:element name="sin-clasificar" type="tSinClasificar"/>
</xs:choice>
<xs:element name="sinopsis" type="xs:string"/>
<xs:choice>
<xs:element name="director" type="xs:string" />
<xs:element name="directora" type="xs:string" />
</xs:choice>
<xs:element name="reparto" type="tReparto"/>
<xs:element name="web" type="url" minOccurs="0" maxOccurs="1"/>
<xs:element name="imdb" type="url"/>
<xs:element name="cartel" type="xs:string"/>
</xs:sequence>
<xs:attribute name="codigo" type="xs:ID" use="required"/>
<xs:attribute name="duracion" type="xs:positiveInteger" use="required"/>
<xs:attribute name="ano" type="xs:positiveInteger" use="required"/>
</xs:complexType>

<xs:complexType name="tGenero">
<xs:sequence>
<xs:element name="genero" type="xs:string" maxOccurs="unbounded" />
</xs:sequence>
</xs:complexType>

<xs:complexType name="tClasificacion">
<xs:attribute name="edad" type="tEdad" use="required"/>
</xs:complexType>

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

<xs:complexType name="tSinClasificar" />

<xs:complexType name="tReparto">
<xs:sequence>
<xs:choice minOccurs="1" maxOccurs="unbounded">
<xs:element name="actor" type="xs:string" />
<xs:element name="actriz" type="xs:string" />
</xs:choice>
</xs:sequence>
</xs:complexType>

<xs:simpleType name="url">
<xs:restriction base="xs:string">
<xs:pattern value="([Hh][Tt]{2}[Pp][Ss]?)://.*" />
</xs:restriction>
</xs:simpleType>
</xs:schema>