Validació amb DTD
Introducció
La validació de documents XML és el procés de comprovar que un document XML compleix un conjunt de regles o estructures definides en un esquema.
Aquestes regles es poden definir mitjançant un Document Type Definition (DTD) o altres llenguatges d'esquema com XML Schema (XSD)
Què és el DTD?
El DTD (Document Type Definitions) és una forma de definir l'estructura i les etiquetes vàlides en un document XML.
L'objectiu principal dels DTD és permetre validar les estructures dels documents XML.
El document XML es comprovarà amb l'esquema DTD.
Hi poden haver documents ben formats que no siguin vàlids.
El DTD pot ser compartit entre organitzacions o, fins i tot, definir-lo com a estàndard públic.
Això permetrà conèixer les especificacions que defineixen un vocabulari concret.
Limitacions del DTD
El DTD no és un llenguatge XML: Això obliga a aprendre dos llenguatges en comptes d'un!
DTD no pot fer comprovacions del contingut de dades:
No pot comprovar que és una data correcte.
Podria fer falta definir restriccions en el document però amb DTD no es pot:
Per exemple una data entre 1970 i 2032.
Encara hi ha molts documents XML que es validen amb DTD (tot i que té les seves limitacions).
Validació
Amb xmllint ho podem fer amb valid
:
També es pot fer amb el programa XML Copy Editor, VS Code amb l'extenció d'XML, etc...
O amb validadors online:
El llenguatge DTD
Definició del DTD
Definició de DTD Interna
Es poden incorporar DTD dins dels documents XML:
Tot i que es pot fer és millor fer-los externs.
Definició de DTD Externa
Definir-lo externament:
Permet compartir-los més fàcilment
Separa les dades de la estructura.
Per definir un DTD extern que s'utilitza fent servir l'etiqueta DOCTYPE
dins del document XML:
Es poden definir DOCTYPES d'Internet:
O en fitxers locals:
I després només hem de crear el DTD extern en el lloc adequat:
Elements
S'han de definir tots els elements que formen el document:
En el contingut
és on definirem completament l'estructura del document XML:
Si hi ha dades
Si conté altres etiquetes
Etc.
Elements genèrics
Si tenim elements que poden tenir qualsevol cosa a dins els podem definir amb
ANY
Aquests elements podràn contenir altres etiquetes o bé dades.
Per exemple:
Podem definir <persona>
:
Entrada de text: #PCDATA
Un #PCDATA indica que l'element que estem definint només pot tenir dades a dins.
Per exemple:
Es definiria el DTD amb:
Elements sense dades
Si tenim elements que no tenen contingut els podem definir amb
EMPTY
.
Per exemple:
XML
DTD
Elements fills
El més normal és que una etiqueta en contingui d'altres.
Els elements que contenen altres etiquetes es defineixen amb el nom dels elements fills dins de parèntesis
()
.
Els definim posant les etiquetes que pot contenir:
DTD
ATENCIÓ: Els elements fills han d'aparèixer en el XML en la mateixa seqüència (ordre) que en el DTD.
Es poden definir elements recursius:
Però s'ha d'anar amb compte perquè podem generar un problema molt més gran.
Definir elements que no s'acabin mai i que per tant no puguin ser validats.
O sigui que es poden fer però sempre s'han de tractar amb cura
Modificadors dels elements fills
Podem especificar quantes instàncies dels elements fills hi poden haver en un element.
?
: Indica que l'element hi pot ser o no.*
: Indica que l'element hi pot ser un número indeterminat de vegades o no ser-hi.+
: Indica que l'element hi ha de ser una vegada o més.
Per exemple:
DTD
XML
Operador d'elecció
També tenim un operador que ens permet posar alternatives
|
Ens permetria fer:
O bé:
Parèntesis
Evidentment podem fer tantes agrupacions de parèntesi com ens facin falta.
Exemples:
Centre i radi o bé centre i diàmetre
cognom o nom+inicials+cognom o nom+cognom
Limitacions
No es poden posar etiquetes i #PCDATA que no siguin "contingut barrejat".
Això és erroni:
Tampoc podem duplicar definicions:
O sigui que hem de fer això (tot i que pot no ser el que volem)
Expressions deterministes
Una altra de les limitacions és que obliga a que les expressions han de ser deterministes.
Això vol dir que no es pot fer això:
Això és perquè el processador al rebre 'persona' no pot saber quina és l'expressió que estem fent.
Ho hem d'escriure:
El mateix ens passarà si fem servir modificadors:
Per exemple perquè surti en l'ordre que vulguem autor i títol:
Després de rebre autor en quina expressió estem? I si rebem títol? Ho hauríem d'escriure d'aquesta forma:
Ara no queda cap dubte de on som al rebre una etiqueta
Atributs
Ens pot interessar limitar quins atributs pot contenir una etiqueta.
No es poden fer atributs genèrics s'han de definir en cada element.
Els atributs es defineixen amb ATTLIST
Atributs dels atributs
Un aspecte curiós és que els atributs tenen atributs que permeten definir com s'usaran.
IMPLIED: L'atribut és opcional. Cada instància de l'element pot o no pot donar-li valor.
REQUIRED: L'atribut és obligatori. Ha d'existir!
FIXED: L'atribut és constant i inmutable. S'ha d'especificar per força ja que és permanent.
DEFAULT: L'atribut ja té un valor per defecte. Si no se n'hi posa cap un programa ha d'assumir aquest valor.
Per exemple:
L'etiqueta equip ha de tenir l'atribut "posicio" obligatòriament
El dni associat al nom és opcional
La versió del document és "1.0" i no es pot canviar
Tipus de dades atributs
Existeixen diferents tipus de dades que es poden fer servir com a tipus d'atributs.
CDATA
Pot contenir qualsevol cadena de caràcters acceptable. Es pot fer servir per preus, URL, emails, etc...
Enumeracions
Posem una llista de valors textuals dins de la declaració de l'atribut
ID
Un atribut pot fer-se servir com identificador d'un element. Aquest atribut ha de ser únic en el document
IDREF o IDREFS
Referències a un ID. El seu valor s'ha de correspondre amb un identificador d'element existent
ENTITY o ENTITIES
Les entitats permeten definir constants pel document. Així doncs l'atribut ha de ser una entitat
NMTOKEN NMTOKENS
Especifiquen els caràcters permesos per XML. O sigui que no s'hi permeten espais
NOTATION
Permet que l'atribut sigui d'una notació anteriorment declarada
CDATA i enumeracions
Els atributs de tipus CDATA permeten la entrada de text de qualsevol tipus.
Ens permetria definir coses com:
Un cas especial serien les enumeracions:
Que permetran que el valor de l'atribut sigui o "setembre" o "octubre" i cap més.
ID
ID serveix per quan els atributs es poden utilitzar com identificadors d'un element dins del document.
Els valors no es poden repetir.
Els valors han de començar per una lletra o pel caràcter de subratllat.
DTD
XML
IDREF o IDREFS
Es fan servir quan el valor ha de ser una referència a un identificador.
IDREFS ens permet fer una llista d'ID separades per espais.
NMTOKEN i NMTOKENS
Els tipus NMTOKEN permeten que especifiquem qualsevol caràcter acceptat per XML.
Això implica text sense espais.
Com la majoria de vegades el NMTOKENS ens en permet especificar diversos separats per espais
O sigui
NOTATION
Aquest atribut permet associar una aplicació a un tipus d'informació.
Es pot canviar PUBLIC per SYSTEM per poder definir una aplicació en particular.
Per exemple un tipus MIME
ENTITY / ENTITIES
Les entitats permeten definir les constants pel document
Els atributs poden fer referència a constants
Podem definir les nostres entitats:
I després utilitzar-les en el document
Entitats predefinides i externes
Tenim entitats que ens permeten escriure caràcters amb el seu valor hexadecimal:
I les ja conegudes
Última actualización
¿Te fue útil?