Aprende XML desde cero hasta convertirte en un experto con este contenido, ejemplos prácticos y tests de conocimiento.
XML (eXtensible Markup Language) es un lenguaje de marcas diseñado para almacenar y transportar información entre aplicaciones diversas en distintas plataformas.
Características principales:
<?xml version="1.0" encoding="UTF-8"?>
<catalogo>
<libro id="101">
<titulo>XML para Expertos</titulo>
<autor>Juan Pérez</autor>
</libro>
</catalogo>
Un documento XML se compone de:
Puede crearse con cualquier editor de texto que reconozca XML:
Se validan mediante analizadores (parsers):
Se visualizan mediante:
La sintaxis de XML es estricta y debe seguir ciertas reglas para que el documento se considere "bien formado":
| Regla | Descripción | Ejemplo |
|---|---|---|
| Elemento raíz único | Todo documento XML debe tener un solo elemento raíz que contenga todos los demás elementos |
<raiz>...todo el contenido...</raiz>
|
| Etiquetas balanceadas | Todas las etiquetas deben tener su correspondiente cierre |
<elemento>contenido</elemento>
|
| Elementos anidados correctamente | Las etiquetas deben cerrarse en el orden inverso al que se abrieron |
<a><b>texto</b></a> (correcto) <a><b>texto</a></b> (incorrecto)
|
| Atributos entre comillas | Los valores de los atributos deben ir siempre entre comillas (simples o dobles) |
<libro id="123"> o <libro id='123'>
|
| Sensible a mayúsculas/minúsculas | XML distingue entre mayúsculas y minúsculas |
<Elemento> y <elemento> son diferentes
|
| Elementos vacíos | Pueden escribirse de dos formas |
<elemento/> o <elemento></elemento>
|
Algunos caracteres tienen significado especial en XML y deben ser escapados usando entidades:
| Carácter | Entidad | Descripción |
|---|---|---|
| < | < | Menor que (se usa para abrir etiquetas) |
| > | > | Mayor que (se usa para cerrar etiquetas) |
| & | & | Ampersand (se usa para entidades) |
| ' | ' | Comilla simple |
| " | " | Comilla doble |
&#nnn; (decimal) o &#xhh; (hexadecimal) ñ o ñ para la letra "ñ"
<?xml version="1.0" encoding="UTF-8"?>
<texto_con_entidades>
<parrafo>El símbolo < se usa para iniciar etiquetas y & para entidades.</parrafo>
<formula>a < b && b > c</formula>
<español>La letra ñ es característica del español.</español>
</texto_con_entidades>
El prólogo XML es opcional pero recomendable. Contiene información sobre el documento XML:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<?xml-stylesheet type="text/css" href="estilo.css"?>
<?xml-stylesheet type="text/xsl" href="transformacion.xsl"?>
Estas instrucciones indican cómo debe procesarse el documento XML, como aplicar hojas de estilo (CSS) o transformaciones (XSL).
Los comentarios en XML permiten incluir notas o aclaraciones que no afectan al contenido del documento:
<?xml version="1.0" encoding="UTF-8"?>
<!-- Este es un comentario en XML -->
<libro>
<titulo>El Reino del Dragón de Oro</titulo>
<!-- Este es el título del libro -->
<autor>Isabel Allende</autor>
</libro>
Los elementos son los bloques de construcción básicos de un documento XML. Cada elemento consiste en una etiqueta de apertura, contenido y una etiqueta de cierre.
<libro>
<titulo>El ingenioso hidalgo Don Quijote de la Mancha</titulo>
<autor>Miguel de Cervantes</autor>
<anio>1605</anio>
</libro>
| Tipo | Descripción | Ejemplo |
|---|---|---|
| Elemento con contenido | Contiene texto y/o elementos hijos |
<titulo>Don Quijote</titulo>
|
| Elemento vacío | No tiene contenido |
<imagen src="portada.jpg"/>
|
| Elemento padre | Contiene otros elementos |
<libro>...</libro>
|
| Elemento hijo | Está contenido dentro de otro elemento |
<autor>...</autor> dentro de <libro>
|
Las reglas para nombrar elementos XML son:
Los atributos proporcionan información adicional sobre los elementos XML. Se colocan dentro de la etiqueta de apertura y siguen el formato nombre="valor".
<libro isbn="978-84-376-0494-7" edicion="2" idioma="es">
<titulo>El ingenioso hidalgo Don Quijote de la Mancha</titulo>
<autor>Miguel de Cervantes</autor>
</libro>
Esta es una decisión de diseño común en XML. Algunas guías:
| Ventajas de atributos | Desventajas de atributos |
|---|---|
|
|
Las secciones CDATA (Character Data) permiten incluir bloques de texto que no serán interpretados como marcado XML, útil para código, fórmulas o texto con muchos caracteres especiales.
<codigo_javascript>
<![CDATA[
function validar() {
if (x < 10 && y > 20) {
return true;
} else {
return "Error: x debe ser < 10";
}
}
]]>
</codigo_javascript>
Los espacios de nombres en XML resuelven problemas de ambigüedad cuando se combinan documentos XML de diferentes fuentes o dominios que pueden usar los mismos nombres de elementos para diferentes propósitos.
<titulo> - uno para libros y otro para personas (títulos nobiliarios).
<?xml version="1.0" encoding="UTF-8"?>
<!-- Sin espacios de nombres (ambiguo) -->
<datos>
<titulo>Don Quijote de la Mancha</titulo> <!-- ¿Libro o título nobiliario? -->
<titulo>Don</titulo> <!-- ¿Libro o título nobiliario? -->
</datos>
Se declaran usando el atributo especial xmlns (XML Namespace):
<?xml version="1.0" encoding="UTF-8"?>
<datos xmlns:libro="http://www.ejemplo.com/libros"
xmlns:persona="http://www.ejemplo.com/personas">
<libro:titulo>Don Quijote de la Mancha</libro:titulo>
<persona:titulo>Don</persona:titulo>
</datos>
Se puede declarar un espacio de nombres por defecto que aplica a todos los elementos sin prefijo:
<?xml version="1.0" encoding="UTF-8"?>
<libros xmlns="http://www.ejemplo.com/libros"
xmlns:editorial="http://www.ejemplo.com/editorial">
<libro> <!-- Usa el namespace por defecto -->
<titulo>Don Quijote</titulo> <!-- Usa el namespace por defecto -->
<editorial:nombre>Anaya</editorial:nombre> <!-- Usa namespace editorial -->
</libro>
</libros>
Un documento XML está "bien formado" cuando:
Un documento XML es "válido" cuando:
DTD es el sistema de validación más antiguo para XML. Define la estructura y los elementos permitidos en un documento XML.
<!-- DTD interna -->
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE biblioteca [
<!ELEMENT biblioteca (libro+)>
<!ELEMENT libro (titulo, autor, anio?)>
<!ELEMENT titulo (#PCDATA)>
<!ELEMENT autor (#PCDATA)>
<!ELEMENT anio (#PCDATA)>
<!ATTLIST libro
id ID #REQUIRED
categoria (ficcion|historia|ciencia) "ficcion">
]>
<biblioteca>
<libro id="lib1" categoria="ficcion">
<titulo>El Quijote</titulo>
<autor>Miguel de Cervantes</autor>
<anio>1605</anio>
</libro>
</biblioteca>
<!DOCTYPE biblioteca SYSTEM "biblioteca.dtd">
| Declaración | Descripción | Ejemplo |
|---|---|---|
| ELEMENT | Define un elemento y su contenido |
<!ELEMENT autor (#PCDATA)>
|
| ATTLIST | Define atributos para un elemento |
<!ATTLIST libro id ID #REQUIRED>
|
| ENTITY | Define entidades personalizadas |
<!ENTITY editor "Editorial Anaya">
|
| NOTATION | Define notaciones para datos no-XML |
<!NOTATION JPEG SYSTEM "image/jpeg">
|
? - Opcional (0 o 1)
* - Cero o más veces
+ - Una o más veces
(a|b|c) - Una de las opciones
(a,b,c) - Secuencia en ese orden
#PCDATA - Texto (Parsed Character Data)
EMPTY - Elemento vacío
XML Schema (XSD) es un sistema de validación más moderno y poderoso que DTD, con mejor soporte para tipos de datos, espacios de nombres y estructuras complejas.
<?xml version="1.0" encoding="UTF-8"?>
<biblioteca xmlns="http://www.ejemplo.com/biblioteca"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.ejemplo.com/biblioteca biblioteca.xsd">
<libro id="L1">
<titulo>Cien años de soledad</titulo>
<autor>
<nombre>Gabriel</nombre>
<apellido>García Márquez</apellido>
</autor>
<anio>1967</anio>
<precio>19.95</precio>
</libro>
</biblioteca>
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.ejemplo.com/biblioteca"
xmlns="http://www.ejemplo.com/biblioteca"
elementFormDefault="qualified">
<xs:element name="biblioteca">
<xs:complexType>
<xs:sequence>
<xs:element name="libro" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="titulo" type="xs:string"/>
<xs:element name="autor">
<xs:complexType>
<xs:sequence>
<xs:element name="nombre" type="xs:string"/>
<xs:element name="apellido" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="anio" type="xs:integer"/>
<xs:element name="precio" type="xs:decimal"/>
</xs:sequence>
<xs:attribute name="id" type="xs:ID" use="required"/>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
Seguir estas prácticas recomendadas te ayudará a crear documentos XML más mantenibles, legibles y eficientes:
Utiliza esta lista para evaluar la calidad de tus documentos XML:
Utiliza este editor interactivo para crear, editar y validar documentos XML en tiempo real:
Crea un documento XML para un catálogo de productos con las siguientes características:
<?xml version="1.0" encoding="UTF-8"?>
<!-- Catálogo de productos para tienda en línea -->
<catalogo fecha="2023-10-15">
<producto id="P001" disponibilidad="si">
<nombre>Smartphone Galaxy S21</nombre>
<precio moneda="EUR">799.99</precio>
<descripcion>Smartphone con pantalla AMOLED de 6.2", 8GB RAM, 128GB almacenamiento</descripcion>
<categoria>Electrónica</categoria>
</producto>
<producto id="P002" disponibilidad="si">
<nombre>Zapatillas Running Air Zoom</nombre>
<precio moneda="EUR">129.95</precio>
<descripcion>Zapatillas de running con amortiguación mejorada y transpirables</descripcion>
<categoria>Deportes</categoria>
</producto>
<producto id="P003" disponibilidad="no">
<nombre>Libro "Cien años de soledad"</nombre>
<precio moneda="EUR">15.50</precio>
<descripcion>Novela del escritor colombiano Gabriel García Márquez</descripcion>
<categoria>Libros</categoria>
</producto>
</catalogo>
Crea un documento XML para una biblioteca de películas e incluye una DTD interna que defina la estructura.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE filmoteca [
<!ELEMENT filmoteca (pelicula+)>
<!ELEMENT pelicula (titulo, director, anio?, genero)>
<!ELEMENT titulo (#PCDATA)>
<!ELEMENT director (#PCDATA)>
<!ELEMENT anio (#PCDATA)>
<!ELEMENT genero (#PCDATA)>
<!ATTLIST pelicula
id ID #REQUIRED>
<!ATTLIST genero
tipo (accion|comedia|drama|ciencia-ficcion|terror|romance) #REQUIRED>
]>
<filmoteca>
<pelicula id="p1">
<titulo>El Padrino</titulo>
<director>Francis Ford Coppola</director>
<anio>1972</anio>
<genero tipo="drama">Drama criminal</genero>
</pelicula>
<pelicula id="p2">
<titulo>Interestelar</titulo>
<director>Christopher Nolan</director>
<genero tipo="ciencia-ficcion">Ciencia ficción</genero>
</pelicula>
</filmoteca>
Crea un documento XML que combine información de dos dominios diferentes utilizando espacios de nombres:
<?xml version="1.0" encoding="UTF-8"?>
<sistema xmlns:contacto="http://www.ejemplo.com/contactos"
xmlns:pedido="http://www.ejemplo.com/pedidos">
<cliente id="C001">
<contacto:informacion>
<contacto:nombre>María González</contacto:nombre>
<contacto:email>maria.gonzalez@ejemplo.com</contacto:email>
<contacto:telefono tipo="movil">+34 612 345 678</contacto:telefono>
<contacto:direccion>
<contacto:calle>Calle Mayor 25</contacto:calle>
<contacto:ciudad>Madrid</contacto:ciudad>
<contacto:cp>28001</contacto:cp>
</contacto:direccion>
</contacto:informacion>
<pedido:historial>
<pedido:orden id="O12345" fecha="2023-09-28">
<pedido:producto codigo="P789">
<pedido:nombre>Monitor LED 27"</pedido:nombre>
<pedido:cantidad>1</pedido:cantidad>
<pedido:precio moneda="EUR">249.99</pedido:precio>
</pedido:producto>
<pedido:producto codigo="P456">
<pedido:nombre>Teclado mecánico</pedido:nombre>
<pedido:cantidad>2</pedido:cantidad>
<pedido:precio moneda="EUR">89.95</pedido:precio>
</pedido:producto>
<pedido:total moneda="EUR">429.89</pedido:total>
</pedido:orden>
</pedido:historial>
</cliente>
</sistema>
Responde a las siguientes preguntas para poner a prueba tus conocimientos sobre XML:
La mejor manera de aprender XML es practicando con proyectos reales. Intenta crear documentos XML para diferentes casos de uso como catálogos de productos, feeds RSS, configuraciones de aplicaciones o intercambio de datos entre sistemas.