XML - Extensible Markup Language

Glossari ràpid

Element: etiqueta amb contingut o fills (<nom>…</nom>).
Atribut: metadada en un element (<persona id="p1">).
Node de text: text dins d’un element.
Arrel: element pare de tot el document.
PI: instrucció de procés (<?xml-stylesheet …?>).
Entitat: seqüència per escriure caràcters especials (&lt;, &amp;).
CDATA: secció de text “sense interpretar”.
Namespace: “cognom” per a etiquetes d’un vocabulari (xmlns:al="…", <al:nom>).


1.- Què és XML?

XML, Extensible Markup Language, és un llenguatge de marques utilitzat per emmagatzemar i intercanviar dades estructurades de manera llegible tant per humans com per màquines.

Principals característiques d’XML

  • És un llenguatge de marques: utilitza etiquetes per definir i estructurar les dades.
  • És extensible: permet definir etiquetes i estructures pròpies per adaptar-se a diferents aplicacions.
  • És jeràrquic: segueix una estructura en forma d’arbre (arrel, pares, fills, germans).
  • Llegible per humans: el format és clar i es pot editar manualment.
  • Interoperable: és un estàndard àmpliament acceptat i entés per moltes aplicacions.
  • Usos variats: configuració de programari, intercanvi de dades entre sistemes, serveis web, representació de documents XHTML, RSS/Atom, SVG, etc.
  • Compatibilitat amb Unicode: pot usar UTF-8, UTF-16 i altres codificacions, permetent representar caràcters de quasi tots els idiomes.

En resum, XML és un llenguatge de marques versàtil i estandarditzat per representar i intercanviar dades estructurades de manera clara i flexible.

XML NO és

  • No és un llenguatge de programació.
  • No és un protocol de xarxa.
  • No és una base de dades.

    XML pot emmagatzemar informació estructurada, però no és una BD en sentit estricte.

Ecosistema i tecnologies relacionades

  • XPath i XQuery: per seleccionar i consultar dades dins de documents XML.
  • XPointer i XLink: per identificar parts concretes d’un document i afegir enllaços.
  • DTD i XML Schema (XSD): per definir l’estructura i validesa dels documents.
  • XSLT i XSL-FO: per transformar documents XML a altres formats i aplicar estils.

2.- Anàlisi i validació d’XML

2.1 Què és un parser i per a què serveix?

Un parser (analitzador) és un programa o llibreria que llegeix un document XML i el comprova contra les regles del llenguatge. Després, el converteix a una estructura que el codi pot manipular (un arbre de nodes, esdeveniments de lectura, etc.).

Utilitats principals:

  • Comprovació de ben formació: detecta errors de sintaxi (arrel única, tancaments, niat, atributs entre cometes…).
  • Validació: pot comprovar l’XML contra un DTD o un XSD per assegurar l’estructura esperada.
  • Accés a dades: exposa el contingut de l’XML al programa (per a llegir, transformar, importar a BD, etc.).

2.2 Tipus de parsers (visió pràctica)

  • DOM: carrega tot el document a memòria i l’exposa com un arbre (fàcil de manipular; cost en memòria).
  • SAX: processament basat en esdeveniments (seqüencial, molt eficient en memòria; més complex per modificar).
  • StAX (pull parsing): semblant a SAX però el codi controla quan llegir el pròxim esdeveniment (equilibri entre DOM i SAX).

2.3 Nivells de comprovació

Ben format (well-formed) Document que compleix les regles bàsiques d’XML. Exemple correcte:

<article>Disquet</article>

Exemple incorrecte:

<article>Disquet

Vàlid (valid) Document ben format que, a més, compleix l’estructura definida en un DTD o XSD. Exemple: si l’esquema indica que <persona> ha de tindre <nom> i <edat>, un document sense <edat> és ben format però no vàlid.

2.4 Tractament d’errors

  • Errors de ben formació: fatals; el parser ha d’aturar-se.
  • Errors de validesa: el parser pot continuar, però el document es qualifica com a invàlid.

2.5 Analitzadors XML habituals

  • xmllint (libxml2).
  • Apache Xerces (Java, C++).
  • Expat (C).

Comandes bàsiques amb xmllint:

xmllint --noout exemple.xml                 # comprova ben formació
xmllint --schema esquema.xsd exemple.xml    # comprova validesa

3.- Regles bàsiques d’XML

Un document XML està format per text, etiquetes i atributs.

Exemple:

<nom carrec="coordinadora">Isabel S.</nom>
  • Etiquetes: <nom>...</nom>
  • Atributs: carrec="coordinadora"
  • Text: Isabel S.

3.1 Regles fonamentals

  1. Etiqueta arrel única

Correcte:

<persona>
  <nom>Ana</nom>
</persona>

Incorrecte (dues arrels):

<persona>
  <nom>Ana</nom>
</persona>
<nom>Lola</nom>
  1. Etiquetes tancades

Correcte:

<article>Disquet</article>

Incorrecte:

<article nom="disquet">

Etiqueta buida:

<article nom="disquet"/>

o també:

<article/>
  1. Etiquetes correctament niades

Correcte:

<inventari>
  <article>Disquet</article>
</inventari>

Incorrecte:

<inventari>
  <article>Disquet</inventari>
</article>
  1. Noms d’elements i atributs
  • Han de començar per lletra o _.
  • Poden incloure lletres, dígits, -, _, . i : (este últim només quan es treballa amb namespaces).
  • No poden contindre espais.
  • No poden començar per xml (en qualsevol combinació de majúscules/minúscules).

    El caràcter : està reservat per a namespaces. No l’utilitzes en noms si no declares un prefix amb xmlns:.

Correctes:

<Ciutat></Ciutat>

<Item12></Item12>

<_Hola></_Hola>

Incorrectes:

<1Osset></1Osset>

<Aitor Tilla></Aitor Tilla>

<$Diners></$Diners>
  1. Distinció majúscules/minúscules
<Article>Disquet</Article>
<article>Disquet</article>  <!-- elements diferents -->
  • Seria incorrecte:
<Article>Disquet</article>  <!-- Distingeix majuscules i minuscules -->
  1. Atributs sempre va entre cometes i amb valor

Correcte:

<Article quantitat="3">Disquet</Article>

Incorrectes:

<Article quantitat=3>Disquet</Article> <!-- Valor del atribut sense cometes -->
<Article quantitat>Disquet</Article> <!-- Atribut sense valor -->

Exemple:

<?xml version="1.0" encoding="UTF-8"?>
<persona nacionalitat="Espanya">
  <nom>Ana</nom>
  <edat>20</edat>
</persona>

4.- Creació de documents XML

Aquesta secció recull elements freqüents d’un document XML i explica per a què serveix cadascun amb exemples pràctics.

4.1 Declaració XML

Línia opcional però recomanable al principi del fitxer. Indica versió, codificació de caràcters i si el document depén d’entitats externes.

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
  • version: habitualment "1.0".
  • encoding: codificació de caràcters (per defecte, UTF-8).
  • standalone: "yes" si el document és autosuficient; "no" si depén, per exemple, d’un DTD extern.

Utilitat: garantir una interpretació correcta de caràcters (accents, símbols), interoperabilitat entre sistemes i claredat sobre dependències externes.

4.2 Atributs

Aporten metadades o paràmetres a un element en forma de parell clau="valor" i sempre entre cometes.

<persona nom="Lola" cognom="Mento" edat="30"/>

Quan usar atributs o elements:

Tria ATRIBUT quan… Tria ELEMENT quan…
És metadada curta (id, tipus, lang) És contingut o estructura
Es consulta sovint com a clau Necessites fills o text llarg
No admet subetiquetes Lògica de llista/array

Exemples d’atributs especials definits pel mateix XML:

  • xml:lang: idioma del contingut.
  • xml:id: identificador únic.
  • xml:base: URL base per a rutes relatives.
  • xml:space: control d’espais en blanc (default/preserve).

4.3 Entitats

Serveixen per escriure caràcters reservats o problemàtics dins del text.

Entitat Caràcter Ús típic
&lt; < Mostrar < en text sense iniciar una etiqueta
&gt; > Mostrar > en text
&amp; & En URLs amb paràmetres: ?q=1&amp;cat=2
&quot; " Cometes dins d’un atribut
&apos; ' Apòstrof

Correcte:

<frase>5 &lt; 10 &amp; 3 &gt; 2</frase>
<url>https://exemple.com?q=1&amp;cat=2</url>

Incorrecte:

<frase>5 < 10</frase> <!-- el parser interpreta "< 10" com a marca -->

4.4 CDATA

Una secció CDATA indica al parser que no ha d’interpretar el contingut com a marques, sinó com a text literal. És útil per incrustar fragments amb <, >, & sense haver-los d’escapar.

<script>
  <![CDATA[
    if (5 < 10) {
      alert("Hola món");
    }
  ]]>
</script>

Limitacions: dins d’una CDATA no pot aparéixer la seqüència ]]> i no es poden niar.

CDATA no es pot usar en atributs. És equivalent a escriure el mateix contingut escapant <, &, etc.; només és una forma més còmoda per a fragments llargs.

4.5 Comentaris

Informació per a persones lectores; els parsers els ignoren.

<!-- Aquest és un comentari -->
<persona>
  <nom>Ana</nom>
  <!-- <edat>20</edat>  comentat temporalment -->
</persona>

4.6 Instruccions de procés (Processing Instructions, PI)

Informen aplicacions de com tractar el document. Les més comunes associen fulls d’estil (CSS o XSLT).

Exemple amb CSS:

<?xml-stylesheet type="text/css" href="estilo-animales.css"?>
<animales>
  <animal>
    <nombre>Perro</nombre>
    <patas>4</patas>
  </animal>
</animales>

Fitxer estilo-animales.css:

nombre { color: blue; font-size: 40px }
patas  { color: red;  font-size: 22px }

Un navegador compatible aplicarà l’estil als elements mostrant “nombre” en blau i “patas” en roig.

Exemple amb XSLT:

<?xml-stylesheet type="text/xsl" href="transformacio.xsl"?>

Això indica que el document es pot transformar a HTML (o altre format) usant l’estil XSLT indicat.


5.- Espais de noms (Namespaces)

En XML qualsevol pot inventar etiquetes amb qualsevol nom. El problema és que, si combines documents diferents, pots tindre etiquetes amb el mateix nom però amb significat diferent.

Exemple sense namespaces (conflicte):

<nom>Ana</nom>       <!-- és un alumne -->
<nom>Laura</nom>     <!-- és un professor -->

El processador no sap distingir-los.

Els espais de noms (namespaces) servixen per diferenciar vocabularis (conjunts d’etiquetes).

Amb els namespaces evitarem conflictes de noms quan barregem vocabularis: el prefix és el “cognom” de l’etiqueta i la URI és un identificador únic (no té per què ser una web).


5.1. Sintaxi bàsica

Declarem un namespace amb l’atribut xmlns:

<classe xmlns:al="http://exemple.org/alumnes"
        xmlns:pr="http://exemple.org/professors">

  <al:nom>Ana</al:nom>
  <pr:nom>Laura</pr:nom>

</classe>
  • xmlns:al="http://exemple.org/alumnes" Tot el que comence amb al: és del vocabulari d’alumnes.

  • xmlns:pr="http://exemple.org/professors" Tot el que comence amb pr: és del vocabulari de professors.

Ara queda clar quin nom pertany a cada grup.


5.2. Namespace per defecte

També podem definir un namespace per defecte (sense prefix).

<classe xmlns="http://exemple.org/alumnes"
        xmlns:pr="http://exemple.org/professors">

  <nom>Ana</nom>       <!-- del vocabulari d’alumnes -->
  <pr:nom>Laura</pr:nom>  <!-- del vocabulari de professors -->

</classe>

Tin en compte que:

  • La cadena (http://exemple.org/alumnes) és només un identificador únic. No cal que siga una web real ni que continga res.

  • El vocabulari és simplement el conjunt d’etiquetes que formen part d’eixe namespace (al:nom, al:alumne, al:grup, etc.).

  • La utilitat pràctica: permet barrejar diferents llenguatges dins d’un mateix document XML sense conflictes.


5.3. Exemple amb llenguatges reals

Un document XML que combina XHTML i SVG:

<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:svg="http://www.w3.org/2000/svg">

  <body>
    <h1>Exemple mixt</h1>
    <svg:svg width="120" height="60">
      <svg:rect x="10" y="10" width="100" height="40"/>
    </svg:svg>
  </body>

</html>
  • Les etiquetes sense prefix (<html>, <body>, <h1>) pertanyen a XHTML.
  • Les etiquetes amb prefix svg: pertanyen a SVG.

Alguns espais de noms coneguts:

  • XMLhttp://www.w3.org/XML/1998/namespace
  • XHTMLhttp://www.w3.org/1999/xhtml
  • SVGhttp://www.w3.org/2000/svg
  • XSLThttp://www.w3.org/1999/XSL/Transform

En resum

  • Un namespace és com un cognom per a les etiquetes.
  • Servix per diferenciar etiquetes amb el mateix nom però de vocabularis diferents.
  • La URI (http://exemple.org/alumnes) és només un identificador únic, no cal que existisca com a web.
  • Així podem combinar vocabularis (p. ex. XHTML + SVG) en un mateix document XML sense errors.

6.- Errors típics en XML

Dues etiquetes arrel

<persona>Ana</persona>
<persona>Pere</persona>  <!-- ERROR -->

Etiquetes mal niades

<article><titol>Hola</article></titol>  <!-- ERROR -->

Atributs sense cometes

<article quantitat=3>Disquet</article>   <!-- ERROR -->

Caràcters especials sense entitats

<text>5 < 10</text>  <!-- ERROR -->

Prefix de namespace sense declarar

<A:nom>Ana</A:nom>   <!-- ERROR: falta xmlns:A -->

En resum…

  • Una única arrel.
  • Etiquetes tancades i niades correctament.
  • Atributs entre cometes i amb valor.
  • Entitats per a <, >, &, ", '.
  • Prefixos de namespace declarats abans d’usar-los.
  • Document ben format abans de validar contra DTD/XSD.


Table of contents