Ejercicio Esquemas XML

La herramienta de validación desde línea de comandos que utilizaremos se llama xmllint, que pertenece al paquete debian libxml2-utils Para validar un fichero xml con un fichero XSD (XML Schema Definition) ejecutamos el siguiente comando:

xmllint fichero.xml --schema fichero.xsd

Tambien podemos utilizar un programa gráfico que se llama xsddiagram.

Ejemplo 1: Tipos simples

ejemplo1.xml

<?xml version="1.0" encoding="utf-8"?>
<nota>hola</nota>

ejemplo1.xsd

<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="nota" type="xs:string"/>
</xs:schema>

Ejemplo 2: Tipos complejos

libro1.xml

<libro>
    <autor>Miguel de Cervantes Saavedra</autor>
    <titulo>El Quijote de la Mancha</titulo>
</libro>

libro1.xsd

<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="libro">
    <xs:complexType>
        <xs:sequence>
            <xs:element name="autor" type="xs:string" />
            <xs:element name="titulo" type="xs:string" />
        </xs:sequence>
    </xs:complexType>
    </xs:element>
</xs:schema>

Ejemplo 3: Tipos complejos II

libro2.xml

<biblioteca>
    <libro>
        <autor>Miguel de Cervantes Saavedra</autor>
        <titulo>El Quijote de la Mancha</titulo>
    </libro>
    <libro>
        <autor>Pablo Neruda</autor>
        <titulo>Veinte poemas de amor y una canción desesperada</titulo>
    </libro>
</biblioteca>

libro2.xsd

<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="biblioteca">
    <xs:complexType>
        <xs:sequence>
            <xs:element name="libro" minOccurs="0" maxOccurs="unbounded">
                <xs:complexType>
                    <xs:sequence>
                        <xs:element name="autor" />
                        <xs:element name="titulo" />
                    </xs:sequence>
                </xs:complexType>
            </xs:element>
        </xs:sequence>
    </xs:complexType>
</xs:element>
</xs:schema>

Ejemplo 4: Restricciones

libro3.xml

<?xml version="1.0" encoding="utf-8"?>
<biblioteca>
    <libro>
        <autor>Miguel de Cervantes Saavedra</autor>
        <titulo>El Quijote de la Mancha</titulo>
        <codigo>123</codigo>
    </libro>
    <libro>
        <autor>Pablo Neruda</autor>
        <titulo>Veinte poemas de amor y una canción desesperada</titulo>
        <codigo>124</codigo>
    </libro>
</biblioteca>

libro3.xsd

<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="biblioteca">
    <xs:complexType>
        <xs:sequence>
            <xs:element name="libro" minOccurs="0" maxOccurs="unbounded">
                <xs:complexType>
                    <xs:sequence>
                        <xs:element name="autor" />
                        <xs:element name="titulo" />
                        <xs:element name="codigo">
                            <xs:simpleType>
                                <xs:restriction base="xs:integer">
                                    <xs:minInclusive value="1"/>
                                    <xs:maxInclusive value="9999"/>
                                </xs:restriction>
                            </xs:simpleType>
                        </xs:element>
                    </xs:sequence>
                </xs:complexType>
            </xs:element>
        </xs:sequence>
    </xs:complexType>
</xs:element>
</xs:schema>

Ejemplo 5: Restricciones II

libro4.xml

<?xml version="1.0" encoding="utf-8"?>
<biblioteca>
    <libro>
        <autor>Miguel de Cervantes Saavedra</autor>
        <titulo>El Quijote de la Mancha</titulo>
        <codigo>123</codigo>
        <ubicacion>estantería 1</ubicacion>
    </libro>
    <libro>
        <autor>Pablo Neruda</autor>
        <titulo>Veinte poemas de amor y una canción desesperada</titulo>
        <codigo>124</codigo>
        <ubicacion>estantería 11</ubicacion>
    </libro>
</biblioteca>

libro4.xsd

<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="biblioteca">
    <xs:complexType>
        <xs:sequence>
            <xs:element name="libro" minOccurs="0" maxOccurs="unbounded">
                <xs:complexType>
                    <xs:sequence>
                        <xs:element name="autor" />
                        <xs:element name="titulo" />
                        <xs:element name="codigo">
                            <xs:simpleType>
                                <xs:restriction base="xs:integer">
                                    <xs:minInclusive value="1"/>
                                    <xs:maxInclusive value="9999"/>
                                </xs:restriction>
                            </xs:simpleType>
                        </xs:element>
                        <xs:element name="ubicacion">
                            <xs:simpleType>
                                <xs:restriction base="xs:string">
                                    <xs:enumeration value="estantería 1"/>
                                    <xs:enumeration value="estantería 2"/>
                                    <xs:enumeration value="estantería 3"/>
                                    <xs:enumeration value="estantería 4"/>
                                    <xs:enumeration value="estantería 5"/>
                                    <xs:enumeration value="estantería 6"/>
                                    <xs:enumeration value="estantería 7"/>
                                    <xs:enumeration value="estantería 8"/>
                                    <xs:enumeration value="estantería 9"/>
                                    <xs:enumeration value="estantería 10"/>
                                    <xs:enumeration value="estantería 11"/>
                                    <xs:enumeration value="estantería 12"/>
                                    <xs:enumeration value="estantería 13"/>
                                    <xs:enumeration value="estantería 14"/>
                                </xs:restriction>
                            </xs:simpleType>
                        </xs:element>
                    </xs:sequence>
                </xs:complexType>
            </xs:element>
        </xs:sequence>
    </xs:complexType>
</xs:element>
</xs:schema>

Ejemplo 6: Atributos

libro5.xml

<?xml version="1.0" encoding="utf-8"?>
<biblioteca>
    <libro codigo="123" ubicacion="estantería 1">
        <autor>Miguel de Cervantes Saavedra</autor>
        <titulo>El Quijote de la Mancha</titulo>
    </libro>
    <libro codigo="1023" ubicacion="estantería 3">
        <autor>Pablo Neruda</autor>
        <titulo>Veinte poemas de amor y una canción desesperada</titulo>
    </libro>
</biblioteca>

libro5.xsd

<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="biblioteca">
    <xs:complexType>
        <xs:sequence>
            <xs:element name="libro" minOccurs="0" maxOccurs="unbounded">
                <xs:complexType>
                    <xs:sequence>
                        <xs:element name="autor" />
                        <xs:element name="titulo" />
                    </xs:sequence>
                    <xs:attribute name="codigo">
                        <xs:simpleType>
                            <xs:restriction base="xs:integer">
                                <xs:minInclusive value="1"/>
                                <xs:maxInclusive value="9999"/>
                            </xs:restriction>
                        </xs:simpleType>
                    </xs:attribute>
                    <xs:attribute name="ubicacion">
                        <xs:simpleType>
                            <xs:restriction base="xs:string">
                                <xs:enumeration value="estantería 1"/>
                                <xs:enumeration value="estantería 2"/>
                                <xs:enumeration value="estantería 3"/>
                                <xs:enumeration value="estantería 4"/>
                                <xs:enumeration value="estantería 5"/>
                                <xs:enumeration value="estantería 6"/>
                                <xs:enumeration value="estantería 7"/>
                                <xs:enumeration value="estantería 8"/>
                                <xs:enumeration value="estantería 9"/>
                                <xs:enumeration value="estantería 10"/>
                                <xs:enumeration value="estantería 11"/>
                                <xs:enumeration value="estantería 12"/>
                                <xs:enumeration value="estantería 13"/>
                                <xs:enumeration value="estantería 14"/>
                            </xs:restriction>
                        </xs:simpleType>
                    </xs:attribute>
                </xs:complexType>
            </xs:element>
        </xs:sequence>
    </xs:complexType>
</xs:element>
</xs:schema>