Está en la página 1de 12

Tarea para LMSGI04

Abdelhak El Mohammadiane Tarbift

1.- Una empresa utiliza ficheros XML para realizar el inventario, entre otras
cosas, de impresoras. Para cada impresora se quiere guardar su número de serie,
marca, modelo, peso, tamaños de papel con los que puede trabajar, el cartucho
que usa, el tipo, el año de compra y si está en red o no.

Un ejemplo de estos ficheros sería:

<impresoras>
<impresora numSerie="i245" tipo="láser" compra="2010">
<marca>Epson</marca>
<modelo>EPL300</modelo>
<peso>4.52</peso>
<tamaño>A4</tamaño>
<tamaño>A5</tamaño>
<cartucho>C-123BV</cartucho>
<enred/>
</impresora>
<impresora numSerie="i246" tipo="matricial">
<marca>HP</marca>
<modelo>LaserJet 2410</modelo>
<peso>3.2</peso>
<tamaño>A4</tamaño>
<cartucho>C-456P</cartucho>
</impresora>
</impresoras>
Escribe un XML Schema para estos ficheros, eligiendo los tipos de datos más
apropiados y teniendo en cuenta que:

 El peso es un número positivo y no puede tener más de dos decimales.


 Puede haber más de un tamaño.
 El atributo tipo sólo puede tomar los valores ‘matricial’, ‘láser’ y ‘tinta’. Es
obligatorio.
 El atributo numSerie es obligatorio y hace de identificador.
 El cartucho está formado por una C mayúscula, un guión, tres números y una
o dos letras mayúsculas.
 Todos los elementos son obligatorios, menos enred.
 El elemento enred es opcional. De estar presente, es un elemento vacío.
 El atributo compra, opcional, guarda el año de compra. Es un número
entero positivo.
 En cada fichero hay datos para una o más impresoras.
XML
SCHEMA

El elemento padre es <xs:schema> y de be contener declaraciones para todos


los elementos que se encuentran en el xml.

El elemento hijo es <xs:element>.

En xml schema no tenemos forma de definir el elemento raíz de una forma


especial, lo indicaremos con <xs:element name=”root”> , al que definiremos de
tipo complejo si alberga más elementos en su interior y la etiqueta xs:sequence
para ir añadiendo los diferentes elementos que lo forman y sus restricciones. Así
nos quedará un xml schema anidado.

Los atributos han de declararse después de la etiqueta sequence que define


los elementos del root.

El XML schema nos va a permitir realizar validaciones avanzadas.

Este es el XMl validado contra el documento1.xsd:

<?xml version="1.0" encoding="UTF-8"?>


<impresoras xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="Documento1.xsd"> <!--enlace con ruta
relativa para validarlo contra el xsd-->

<impresora numSerie="i245" tipo="láser" compra="2010">

<marca>Epson</marca>

<modelo>EPL300</modelo>

<peso>4.52</peso>

<tamaño>A4</tamaño>

<tamaño>A5</tamaño>

<cartucho>C-123BV</cartucho>

<enred/>

</impresora>

<impresora numSerie="i246" tipo="matricial">

<marca>HP</marca>

<modelo>LaserJet 2410</modelo>

<peso>3.2</peso>

<tamaño>A4</tamaño>

<cartucho>C-456P</cartucho>

</impresora>

</impresoras>

Ahora el XML Schema llamado documento1:


He añadido comentarios de este tipo:<!---------> aunque son preferibles los
comentarios realizados de esta manera ya que son procesables y se pueden estructurar:

<xs:anotation>

<xs:documentation>

Define una lista de impresoras.Pilar Alonso Suela.Tarea 04.1 DAMEL

</xs:documentation>

</xs:anotation>

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

<xs:element name="impresoras">

<xs:complexType>

<xs:sequence>

<!--aquí hacemos referencia al elemento impresora, las referencias son


una manera de hacer el xml schema más legible.Habrá datos para una o más
impresoras-->

<xs:element ref="impresora" minOccurs="1"


maxOccurs="unbounded"/>
</xs:sequence>

</xs:complexType>

</xs:element>

<xs:element name="impresora">

<xs:complexType>

<xs:sequence>

<xs:element name="marca" type="xs:string" minOccurs="1"


maxOccurs="unbounded"/>

<xs:element name="modelo" type="xs:string" minOccurs="1"


maxOccurs="unbounded"/>

<xs:element name="peso" minOccurs="1" maxOccurs="unbounded">

<!--el peso debe ser un número positivo y que no tenga más de dos
decimales para ello debe declararse dentro de xs:restriction-->

<xs:simpleType> <!--definimos el valor de tipo simple-->

<xs:restriction base="xs:decimal"><!--base nos indica el tipo de dato


a partir del cual se hace la restricción,en este caso debe de ser decimal-->

<xs:fractionDigits value="2"/> <!--Utilizo fractionDigits para


especificar el número de decimales,ya que total digits aunque se puede aplicar
en decimales especifica el número de cifras total-->

<xs:minInclusive value="1"/>

</xs:restriction>

</xs:simpleType>

</xs:element>

<!--puede haber más de un tamaño-->


<xs:element name="tamaño" type="xs:string" minOccurs="1"
maxOccurs="unbounded"/><!--definimos un número máximo ilimitado de
tamaños, con una ocurrencia mínima de 1-->

<xs:element name="cartucho" minOccurs="1"


maxOccurs="unbounded" >

<xs:simpleType>

<xs:restriction base="xs:string">

<xs:pattern value="[C][\-][0-9][0-9][0-9][A-Z]{1,2}"/>

</xs:restriction>

</xs:simpleType>

</xs:element>

<xs:element name="enred" type="xs:string" default=""


minOccurs="0" />

</xs:sequence>

<!--attributos -->

<!--el atributo numero de serie debe ser obligatorio y además hacer de


identificador de impresora-->

<xs:attribute name="numSerie" use="required">

<xs:simpleType>

<xs:restriction base="xs:ID"><!--Establecemos la restricion de tipo ID-->

</xs:restriction>

</xs:simpleType>

</xs:attribute>

<!--el atributo tipo debe ser obligatorio y además debe solo contemplar los
valores:matricial,laser y tinta-->
<xs:attribute name="tipo" use="required">

<xs:simpleType><!--definimos el tipo simple-->

<xs:restriction base="xs:string"><!--el tipo de dato al cual se le hace la


restricción-->

<xs:enumeration value="matricial"/> <!--dentro de un enumeration


pondremos los diferentes valores-->

<xs:enumeration value="láser"/>

<xs:enumeration value="tinta"/>

</xs:restriction>

</xs:simpleType>

</xs:attribute>

<xs:attribute name="compra" type="xs:positiveInteger"


use="optional"/><!--el atributo compra es opcional y es un entero
positivo, por defecto si no se especifica nada el atributo será
opcional,aunque yo haya preferido especificarlo-->

</xs:complexType>

</xs:element>

</xs:schema>

2.- Una asociación de jugadores de mus utiliza ficheros XML para almacenar la
información de los torneos que organiza. Para cada torneo se quiere guardar el
año en que se realizó, el anterior ganador (su id) y la información de los
participantes. De los participantes se quiere almacenar su identificador, el de su
pareja, su nombre completo, edad, país y también si es cabeza de serie o no.

Un ejemplo de estos ficheros sería:

<torneo edicion="1998" anteriorGanador="j01">


<participante idP="j01" pareja="j02">
<nombre>Manuel Pérez</nombre>
<edad>23</edad>
<pais> España</pais>
<cabezaDeSerie/>
</participante>
<participante idP="j02" pareja="j01">
<nombre>Manuel Gómez</nombre>
<edad>25</edad>
<pais>España</pais>
</participante>
<participante idP="j03" pareja="j04">
<nombre>Ana Puertas</nombre>
<edad>22</edad>
<pais> E5spaña</pais>
<cabezaDeSerie/>
</participante>
<participante idP="j04" pareja="j03">
<nombre>Paco Fraile</nombre>
<edad>45</edad>
<pais>España</pais>
</participante>
</torneo>
Escribe un DTD adecuado para estos ficheros, teniendo en cuenta que:

 Todos los atributos son obligatorios.


 El atributo idP hace de identificador.
 El atributo pareja es el identificador de otro participante que
forzosamente debe estar presente en el fichero.
 El elemento cabezaDeSerie es opcional, los demás son obligatorios.
 En cada fichero hay datos para un solo torneo.
 El torneo tiene que tener participantes.

DTD

Un DTD es un documento con extensión .dtd y se encarga de garantizar que los datos del
XML cumplen las restricciones impuestas en el dtd.

En este caso lo he declarado de forma interna en el xml , pero también es posible


declararlo de forma externa en forma de documento plano de texto de extensión
.dtd

Los elementos terminales(no contienen elementos) se declaran así: <!ELEMENT nombre


tipo_de_dato>

Los elementos no terminales de esta otra manera: <!ELEMENT A(B,C)>


De los cuales habrá que definir su cardinalidad: ?(opciona),*(0,1,varios),+(uno o
varios)|(operador de elección)

<!ATTLIST para declarar atributos y hay varios tipos:ID,IDREF,CDATA,MNTOKEN


y los modificadores: IMPLIED,FIXED,REQUIRED,literal.

También crearemos entidades para trabajar con valores constantes.

REQUERIMIENTOS DE LA TAREA

Como el torneo debe de tener participantes usamos > + para establecer un mínimo
de 1 o más en la cardinalidad del elemento torneo.

Como los atributos deben ser obligatorios utilizaremos #REQUIRED

Dentro del elemento participante nos encontraremos que todos los elementos
contenidos deben al menos tener una ocurrencia (+) y que el elemento cabezaDeSerie
es opcional por eso uso >?

Como idP debe ser un identificador > añadiremos ID para declarar el atributo

como identificador.

El atributo pareja debe hacer referencia al idP de otro participante para ello
utilizaré IDREF.

Quedaría así:

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE torneo [

<!ELEMENT torneo (participante+)>

<!ATTLIST torneo edicion CDATA #REQUIRED>

<!ATTLIST torneo anteriorGanador CDATA #REQUIRED>

<!ELEMENT participante (nombre+,edad+,pais+,cabezaDeSerie?)>

<!ATTLIST participante idP ID #REQUIRED>

<!ATTLIST participante pareja IDREF #REQUIRED>

<!ELEMENT nombre (#PCDATA)>


<!ELEMENT edad (#PCDATA)>

<!ELEMENT pais (#PCDATA)>

<!ELEMENT cabezaDeSerie (#PCDATA)>

]>

<torneo edicion="1998" anteriorGanador="j01">

<participante idP="j01" pareja="j02">

<nombre>Manuel Pérez</nombre>

<edad>23</edad>

<pais> España</pais>

<cabezaDeSerie/>

</participante>

<participante idP="j02" pareja="j01">

<nombre>Manuel Gómez</nombre>

<edad>25</edad>

<pais>España</pais>

</participante>

<participante idP="j03" pareja="j04">

<nombre>Ana Puertas</nombre>

<edad>22</edad>

<pais> E5spaña</pais>

<cabezaDeSerie/>

</participante>
<participante idP="j04" pareja="j03">

<nombre>Paco Fraile</nombre>

<edad>45</edad>

<pais>España</pais>

</participante>

</torneo>

Adjunto captura de pantalla de Copy Editor y el archivo será .dtd:

También podría gustarte