Ferramentas, validacións de Schemas e exemplo completo

De Manuais Informática - IES San Clemente.
Ir a la navegación Ir a la búsqueda

Ferramentas

Para poder facer schemas usaremos as mesmas ferramentas que usabamos en XML.

Ver ferramentas empregadas en XML : Utilización de ferramentas

Validación de schemas

Para validar un schema poderemos facelo dende:

http://www.w3.org/2001/03/webdata/xsv


Exemplo completo de creación dun arquivo .XSD partindo dun arquivo .XML

Nesta sección imos a crear un arquivo .xsd partindo do arquivo .xml empregando 3 formas diferentes de facelo.

Arquivo .xml orixinal "shiporder.xml":

<?xml version="1.0" encoding="ISO-8859-1"?>

<shiporder orderid="889923"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="shiporder.xsd">
  <orderperson>John Smith</orderperson>
  <shipto>
    <name>Ola Nordmann</name>
    <address>Langgt 23</address>
    <city>4000 Stavanger</city>
    <country>Norway</country>
  </shipto>
  <item>
    <title>Empire Burlesque</title>
    <note>Special Edition</note>
    <quantity>1</quantity>
    <price>10.90</price>
  </item>
  <item>
    <title>Hide your heart</title>
    <quantity>1</quantity>
    <price>9.90</price>
  </item>
</shiporder>

O documento XML consiste nun elemento raiz “shiporder”, que contén un atributo requerido chamado “orderid”. O elemento “shiporder” contén tres tipos diferentes de fillos: “orderperson”, “shipto” e “item”. O elemento “item” aparece dúas veces, e contén un “título” e un elemento opcional “note”, unha “cantidade” e un elemento “prezo”.

A liña superior xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance” dille ó procesador XML que este documento deberá estar validado contra un schema. A liña “xsi:noNamespaceSchemaLocation="shiporder.xsd"” especifica onde reside o schema (está no mesmo cartafol que “shiporder.xml”).

Método 1: Forma sinxela de creación dun Schema XSD

Agora queremos crear un Schema XSD para poder validar o documento anterior XML.

Comenzaremos facendo un novo arquivo chamado "shiporder.xsd". Para crear o schema simplemente seguiremos a estructura no documento XML e definiremos cada un dos elementos que imos atopando. . Comezaremos coa declaración standard seguida do elemento xs:schema:

<?xml version="1.0" encoding="ISO-8859-1" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
...
</xs:schema>

No schema superior estamos empregando o namespace standard (xs), e a URI asociada con este namespace é a definición da linguaxe do Schema, que ten o valor standard http://www.w3.org/2001/XMLSchema.

A continuación, temos que definir o elemento "shiporder". Este elemento ten un atributo e contén outros elementos, por tanto considerámolo como tipo complexo. Os elementos fillos de "shiporder" están rodeados por un elemento xs:sequence que define a orde da secuencia dos sub elementos:

<xs:element name="shiporder">
  <xs:complexType>
    <xs:sequence>
      ...
    </xs:sequence>
  </xs:complexType>
</xs:element>

A continuación temos que definir o elemento “orderperson” como un tipo simple (xa que non contén ningún atributo ou outros elementos). O tipo (xs:string) está prefixado no espazo de nomes asociado có Schema XML que indica un schema predefinido de tipo de datos.

<xs:element name="orderperson" type="xs:string"/>

A continuación temos que definir dous elementos que son de tipo complexo: “shipto” e “item”. Comenzamos definindo o elemento “shipto”:

<xs:element name="shipto">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="name" type="xs:string"/>
      <xs:element name="address" type="xs:string"/>
      <xs:element name="city" type="xs:string"/>
      <xs:element name="country" type="xs:string"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>

Cós schemas podemos definir o número posible de ocorrencias para un elemento empregando os atributos maxOccurs e minOccurs. maxOccurs especifica o número máximo de ocorrencias para un elemento e minOccurs especifica o número mínimo de ocorrencias para un elemento. O valor por defecto para maxOccurs e minOccurs é 1.

Agora podemos definir o elemento “item”. Este elemento pode aparecer moitas veces dentro de “shiporder”. Isto especificase axustando o atributo maxOccurs para o elemento “item” ó valor “unbounded”, que significa que pode aparecer tantas veces o elemento “item” como desexe o autor. O elemento “note” é opcional. Isto indícase axustando o atributo minOccurs a cero:

<xs:element name="item" maxOccurs="unbounded">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="title" type="xs:string"/>
      <xs:element name="note" type="xs:string" minOccurs="0"/>
      <xs:element name="quantity" type="xs:positiveInteger"/>
      <xs:element name="price" type="xs:decimal"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>

Agora podemos declarar o atributo do elemento “shiporder”. Xa que é un atributo obrigatorio deberemos empregar use=”required”.

Nota: As declaracións de atributos sempre irán ó final:

<xs:attribute name="orderid" type="xs:string" use="required"/>

Aquí temos o listado completo do schema chamado "shiporder.xsd":

<?xml version="1.0" encoding="ISO-8859-1" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

<xs:element name="shiporder">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="orderperson" type="xs:string"/>
      <xs:element name="shipto">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="name" type="xs:string"/>
            <xs:element name="address" type="xs:string"/>
            <xs:element name="city" type="xs:string"/>
            <xs:element name="country" type="xs:string"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
      <xs:element name="item" maxOccurs="unbounded">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="title" type="xs:string"/>
            <xs:element name="note" type="xs:string" minOccurs="0"/>
            <xs:element name="quantity" type="xs:positiveInteger"/>
            <xs:element name="price" type="xs:decimal"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
    </xs:sequence>
    <xs:attribute name="orderid" type="xs:string" use="required"/>
  </xs:complexType>
</xs:element>

</xs:schema>

Método 2: División do Schema na creación do XSD

O método anterior de deseño é moi simple, pero pode ser dificil de ler e manter cando son documentos complexos.

O seguinte método de deseño está baseado na definición de todos os elementos e atributos primeiro, e a continuación referencialos usando o atributo ref.

Aquí temos o novo arquivo de deseño ("shiporder.xsd"):

<?xml version="1.0" encoding="ISO-8859-1" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

<!-- definition of simple elements -->
<xs:element name="orderperson" type="xs:string"/>
<xs:element name="name" type="xs:string"/>
<xs:element name="address" type="xs:string"/>
<xs:element name="city" type="xs:string"/>
<xs:element name="country" type="xs:string"/>
<xs:element name="title" type="xs:string"/>
<xs:element name="note" type="xs:string"/>
<xs:element name="quantity" type="xs:positiveInteger"/>
<xs:element name="price" type="xs:decimal"/>

<!-- definition of attributes -->
<xs:attribute name="orderid" type="xs:string"/>

<!-- definition of complex elements -->
<xs:element name="shipto">
  <xs:complexType>
    <xs:sequence>
      <xs:element ref="name"/>
      <xs:element ref="address"/>
      <xs:element ref="city"/>
      <xs:element ref="country"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>

<xs:element name="item">
  <xs:complexType>
    <xs:sequence>
      <xs:element ref="title"/>
      <xs:element ref="note" minOccurs="0"/>
      <xs:element ref="quantity"/>
      <xs:element ref="price"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>

<xs:element name="shiporder">
  <xs:complexType>
    <xs:sequence>
      <xs:element ref="orderperson"/>
      <xs:element ref="shipto"/>
      <xs:element ref="item" maxOccurs="unbounded"/>
    </xs:sequence>
    <xs:attribute ref="orderid" use="required"/>
  </xs:complexType>
</xs:element>

</xs:schema>


Método 3: Empregando nomes para os tipos de datos do Schema XSD

O terceiro método de deseño define clases ou tipos, que permiten a reutilización das definicións de elementos. Isto faise nomeando os elementos de tipos simples e complexos e a continuación referenciándoos a través do atributo type do elemento.

Aquí temos a terceira versión do arquivo de schema ("shiporder.xsd"):

<?xml version="1.0" encoding="ISO-8859-1" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

<xs:simpleType name="stringtype">
  <xs:restriction base="xs:string"/>
</xs:simpleType>

<xs:simpleType name="inttype">
  <xs:restriction base="xs:positiveInteger"/>
</xs:simpleType>

<xs:simpleType name="dectype">
  <xs:restriction base="xs:decimal"/>
</xs:simpleType>

<xs:simpleType name="orderidtype">
  <xs:restriction base="xs:string">
    <xs:pattern value="[0-9]{6}"/>
  </xs:restriction>
</xs:simpleType>

<xs:complexType name="shiptotype">
  <xs:sequence>
    <xs:element name="name" type="stringtype"/>
    <xs:element name="address" type="stringtype"/>
    <xs:element name="city" type="stringtype"/>
    <xs:element name="country" type="stringtype"/>
  </xs:sequence>
</xs:complexType>

<xs:complexType name="itemtype">
  <xs:sequence>
    <xs:element name="title" type="stringtype"/>
    <xs:element name="note" type="stringtype" minOccurs="0"/>
    <xs:element name="quantity" type="inttype"/>
    <xs:element name="price" type="dectype"/>
  </xs:sequence>
</xs:complexType>

<xs:complexType name="shipordertype">
  <xs:sequence>
    <xs:element name="orderperson" type="stringtype"/>
    <xs:element name="shipto" type="shiptotype"/>
    <xs:element name="item" maxOccurs="unbounded" type="itemtype"/>
  </xs:sequence>
  <xs:attribute name="orderid" type="orderidtype" use="required"/>
</xs:complexType>

<xs:element name="shiporder" type="shipordertype"/>

</xs:schema>

A restrición elemento indica que o tipo de datos ven derivado do namespace do W3C XML Schema. Polo tanto, o seguinte fragmento quere dicir que o valor do elemento ou atributo debe ser unha cadea:

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

O elemento restriction é usado moitas veces para aplicar restricións ós elementos. Mira as seguintes liñas do schema anterior:

<xs:simpleType name="orderidtype">
  <xs:restriction base="xs:string">
    <xs:pattern value="[0-9]{6}"/>
  </xs:restriction>
</xs:simpleType>

Isto indica que o valor do elemento ou atributo debe ser unha cadea, debe ter exactamente 6 caracteres nunha fila e eses caracteres deben ser un número entre 0 e 9.


Codigo fonte do exemplo: www.w3schools.com