Definición de esquemas e vocabularios en XML
Sumario
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 (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 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 < 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
- Definicion de esquemas e vocabularios - abrirllave.com
- XML schemas
- Definición de esquemas y vocabularios
- Introdución al tema
- Definición de esquemas y vocabularios en XML
- DTD
- XML Schema
- Schematron - Wikipedia
- Example of different schemas for Book.xml
- Validar documentos XML dtds y schema con XML Copy Editor