Definición de esquemas e vocabularios en XML

De MediaWiki
Ir a la navegación Ir a la búsqueda




Definición de esquemas e vocabularios



Linguaxes de definición e validacion

Introdución

Con XML podense crear novos elementos e atributos libremente.

En ocasións quereremos empregar documentos XML cunha estrutura fixa para intercambiar información. E precisaremos dalgun xeito:

  • Qué nomes se poden empregar para os elementos, cantas veces se poden usar e en qué orde
  • Qué nombs se poden empregar para os atributos, qué elementos os usan e se son obrigatorios ou opcionais
  • Qué tipo de valores admite cada elemento ou atributo e se teñen valores por defecto.

Para todo isto podemos empregar definicións DTD ou esquemas XML (e menos frecuentemente, outros como Relax NG ou Schematron).

Documentos XML ben formados e válidos

Dise que un documento XML está ben formado (well-formed document) cando non ten erros de sintaxe:

  • Os nomes dos elementos e os seus atributos deben estar escritos correctamente.
  • Os valores dos atributos deben estar escritos entre comillas dobles ou simples.
  • Os atributos dun elemento deben separarse con espazos en branco.
  • Teñen que utilizarse referencias a entidades onde sexa necesario.
  • Ten que existir un único elemento raíz.
  • Todo elemento debe ter un elemento pai, excepto o elemento raíz.
  • Todos os elementos deben ter unha etiqueta de apertura e outra de peche.
  • As etiquetas deben estar correctamente anidadas.
  • As instruccións de proceso deben estar escritas de forma correcta.
  • A declaración XML debe estar na primera liña escrita correctamente.
  • As seccións CDATA e os comentarios deben estar correctamente escritos.

Dise que un documento XML é válido (valid) cando ademáis de non ter erros de sintaxe, non incumple ningunha das normas establecidas na súa estrutura, que foi definida utilizando distintos métodos coma:

  • DTD
  • XML Schema.
  • Relax NG
  • Schematron

Podes utilizar ferramentas coma XML Copy Editor para comprobar se un documento XML está ben formado e é válido.

XML e DTDs

O obxectivo duhna DTD (document type definition ou definición de tipo de documento) é definir a estrctura dun documento XML. Isto é, establecer a gramática que contendrá as restriccións que deben cumprir os elementos do XML.

Cando asignamos unha DTD a un documento podemos verificar se o documento é correcto: a súa estrutura responde ao definido na DTD.

Veremos en profundidade na sección XML DTD como levar a cabo esta validación de documentos XML.

XML Schema (XSD)

O XML Schema Definition Language (XSDL) é unha linguaxe XML recomendada polo W3C, creada para describir a estrutura e restriccións do contido dun documento XML. XSDL permite especificar os tipos de datos dos elementos dun documento XML e mellora en moitos aspectos a validación de documentos de DTDs.

Os ficheiros nos que definimos os esquemas XML teñen extensión XSD (XML Schema Definition) e son en si mesmos documentos XML. Cando se valida un documento XML que ten vinculado un esquema XML en realidade se están realizando dúas validacións, xa que o documento XML valídase co esquema XML, e éste a súa vez validaríase cun hipotético XMLSchema.xsd, xa que ten que cumplir a sintaxe dos esquemas XML.

Veremos en profundidade na sección XML Schema (XSD) como levar a cabo esta validación de documentos XML.

Ventajas

Os esquemas XML pretenden solucionar os principales problemas das DTD, polo que teñen varias ventaxas:

  • Permite validar o contenido dos campos do documento
  • Facilita o procesamento dos documentos XML por parte das linguaxes de programación que usan reglas estrictas para definir os tipos de datos utilizados.
  • Únicamente necesitamos un parseador para cotexar o documento XML e a definición do seu esquema, xa que ambos son XML.
  • Permiten definir secuencias de elementos que poden aparecer en calquier orde: (nome, idade, peso), (idade, nome, peso), (nome, peso, idade) oi calquier outra combinación.
  • Nas DTDs os elementos defínense a nivel de documento, polo que non podemos ter nun mesmo documento dous elementos con fillos que teñan o mesmo nome. Os esquemas XML permiten realizar declaracións “sensibles ó contexto”.
  • Os esquemas XML soportan o uso de espazos de nomes e permiten formar claves a partir de varios atributos ou nomes.
Ampliación. Podes ver neste enlace unha comparativa entre as dúas tecnoloxías.

Relax NG

RELAX NG

Relax NG (REgular LAnguage for XML Next Generation) é unha linguaxe de esquema para validación XML.

XMLSchema é bastante complexo no tocante a súa escritura. Relax NG creouse co obxectivo de simplificar a descrición dun documento XML. Este linguaxe provén da fusión da linguaxe TreX de James Clark e da linguaxe Relax de Murata Makoto.

Relax NG ocúpase da descrición e non da coherencia dos valores dos elementos (da cal encárgase XMLSchema). Polo tanto, Relax NG non reemplaza a XMLSchema, pero simplifica a linguaxe.

Podes atopar información máis detallada nas seguintes referencias:

Existen dous tipos de sintaxe de Relax NG

a sintaxe XML
utiliza XML para describir un documento XML
a sintaxe compacta
non está en XML pero é máis concisa e simple


Existen ferramentas coma Trang que permiten pasar de XMLSchema, DTD a Relax NG e viceversa.

Parece impensable que Relax NG reemplace a XML Schema xa que o segundo é moito más maduro. Nembargantes os programadores valoran a simplicidade da linguaxe.

Exemplo

Consideremos un documento XML que representa información sobre libros dunha biblioteca:

<biblioteca>
	<libro>
		<titulo>20000 Leguas de viaxe submarina</titulo>
		<autor>Julio Verne</autor>
	</libro>
	<libro>
		<titulo>Festín de Corvos</titulo>
		<autor>R.R. Martin</autor>
	</libro>
</biblioteca>

A definición do esquema DTD seria:

<!DOCTYPE biblioteca [
<!ELEMENT biblioteca (libro*)>
<!ELEMENT libro (titulo, autor)>
<!ELEMENT titulo (#PCDATA)>
<!ELEMENT autor (#PCDATA)>
]>






E o Relax NG sería algo así:

<element name="biblioteca" xmlns="http://relaxng.org/ns/structure/1.0">
  <zeroOrMore>
    <element name="libro">
      <element name="titulo">
        <text/>
      </element>
      <element name="autor">
        <text/>
      </element>
    </element>
  </zeroOrMore>
</element>

Podemos observar etiquetas como <ZeroOrMore> que indican a cardinalidade do contido, pudendo utilizarse por exemplo <OneOrMore>. Examinaremos as etiquetas máis importantes:

<element name="nome"> 	Permite a definición de etiquetas que poden estar presentes no documento XML
<choice> Permite a elección entre dous conxuntos de etiquetas que poden estar agrupados co tag <group>, 
         sería o equivalente ao paréntesis no DTD, e choice faría a función de |. 
         Esta etiqueta utilízase tanto nos elementos como nos atributos, e se poden facer eleccións entre elementos e atributos.
<attribute name="nome"> Vai dentro dun <element> e permite definir atributos do elemento
<optional> Os elementos e atributos definidos dentro dun tag <optional> serán opcionais
<text/>  Indica que o contido do elemento ou atributo é texto. É o valor por defecto para os atributos. 
         Os elementos teñen que ter definido un tipo de contido obrigatoriamente.
<empty/>  Indica que un elemento non ten contido.
<grammar> Grammar permite definir un esquema Relax NG dun xeito "modular", o que simplifica a definición, 
          comprensión e mantemento do mesmo. A etiqueta <grammar> consta dunha etiqueta <start> e de 
          cero ou máis etiquetas <define name='nome'>. Na etiqueta <start> se realizará a definición da etiqueta raíz, 
          cos elementos do segundo nivel facendo referencia á sección <define> onde se atopa o esquema a aplicar, 
          mediante un tag <ref name='nome'>, permitíndose referencias recursivas.
<data type='tipo' [datatypeLibrary='url']/> Esta etiqueta permite definir o tipo de datos da información. 
          O atributo datatypeLibrary contén unha url identificando a librería de tipos de datos a utilizar, 
          sendo  a  de W3C (W3C XML Schema Datatypes)  http://www.w3.org/2001/XMLSchema-datatypes, que define tipos como 
          integer ou double. O atributo datatypeLibrary pode indicarse no tag <data> ou no tag <element> pai.
          Os <data> poden ter parámetros que restrinxen o rango de valores permitidos. Estes parámetros se indican cun 
          elemento fillo <param name='restricción'>, donde restricción pode ser por exemplo maxLength.
	  O tag <define> pode levar un atributo combine que pode ter dous valores distintos:
<choice> - Indica que no documento XML é posible elexir entre todas as definicións co mesmo nome.
<interleave> - Indica que se poden utilizar calqueira dos elementos definidos co mesmo nome, e en calqueira orde.
<value> - Permite indicar un valor fixo para un elemento ou atributo.
<list> - Permite que un elemento ou atributo conteña unha lista de datos.
<interleave> - Permite que os elementos definidos podan especificarse en calqueira orde
<externalRef href='url'> - Permite facer referencia a un esquema RelaxNG definido en outro ficheiro. 
                           Utilízase na separación modular de esquemas mediante o tag <grammar>.

Schematron

Schematron cun exemplo

Schematron englóbase dentro da familia de linguaxes de marcado XML sendo unha linguaxe de validación baseada en regras e en XPath. Caracterízase por:

  • baséase en afirmacións en vez de en gramática
  • utiliza expresións de acceso en lugar de gramaticais para definir o que se permite e o que non se permite nun documento XML.
  • aporta unha gran flexibilidade na descripción de estruturas relacionais
  • é unha linguaxe moi limitada para especificar a estrutura básica do documento (problema que se arranxa combinando Schematron con outras linguaxes de esquema)

Un exemplo:

<schema xmlns="http://purl.oclc.org/dsdl/schematron">
   <pattern>
      <title>Regras sobre as datas</title>
      <rule context="Contract">
         <assert test="ContractDate &lt; current-date()">ContractDate debería ser no pasado porque contratos futuros non son permitidos.</assert>
      </rule>
   </pattern>
</schema>

Esta regla comproba que o elemento ContractDate teña unha data anterior á data actual. Se esta condición non se cumple, devolverá a mensaxe de erro indicada no corpo do elemento assert

Ampliación. Hai un interesante titorial, con exercicio proposto e resolto

Exercicios

Referencias

Inferiendo esquemas