Introducción a XML y tecnologías asociadas

Las tecnologías XML y JSON son pilares para estructurar, validar y consultar datos en aplicaciones modernas. Esta guía cubre:

Consejo inicial

Memoriza las diferencias clave entre XML y JSON, y entre DTD y XSD, para preguntas comparativas.

XML (eXtensible Markup Language)

Evolución histórica

XML, creado en 1998 por el W3C, simplificó SGML para intercambio de datos en la web, usado en RSS, SVG y SOAP.

Características fundamentales

  • Formato universal de texto
  • Independiente de plataforma
  • Estructura jerárquica
  • Etiquetas personalizadas
  • Extensible

Estructura básica


<?xml version="1.0" encoding="UTF-8"?>
<documento>
  <encabezado>
    <titulo>Ejemplo de XML</titulo>
    <autor idioma="español">Juan Pérez</autor>
  </encabezado>
  <cuerpo>
    <parrafo>Este es un ejemplo de documento XML.</parrafo>
    <parrafo>Muestra la estructura básica.</parrafo>
  </cuerpo>
</documento>
                

Reglas de sintaxis

  • Etiquetas de apertura y cierre
  • Sensible a mayúsculas
  • Anidamiento correcto
  • Atributos entre comillas
  • Un solo elemento raíz
  • Espacios preservados
  • Caracteres especiales escapados (<, >, &)

Bien formado vs. válido

Bien formado Válido
Cumple reglas sintácticas Cumple DTD o XSD
No requiere esquema Requiere esquema

Advertencia

Un XML bien formado no siempre es válido. Distingue ambos conceptos.

XML Namespaces

¿Qué son?

Los namespaces evitan conflictos de nombres en XML al asignar elementos a URI únicos.

Sintaxis


<?xml version="1.0" encoding="UTF-8"?>
<root>
  <lib:libro xmlns:lib="http://example.com/libros">
    <lib:titulo>Don Quijote</lib:titulo>
    <lib:autor>Cervantes</lib:autor>
  </lib:libro>
  <cat:catalogo xmlns:cat="http://example.com/catalogo">
    <cat:producto>Libro</cat:producto>
  </cat:catalogo>
</root>
                

Reglas

Consejo

Practica namespaces en XSD y SOAP.

DTD (Document Type Definition)

¿Qué es?

Una DTD define la estructura y reglas de un documento XML.

Declaración


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE documento [
  <!ELEMENT documento (elemento1, elemento2)>
  <!ELEMENT elemento1 (#PCDATA)>
  <!ELEMENT elemento2 (#PCDATA)>
]>
<documento>
  <elemento1>Texto 1</elemento1>
  <elemento2>Texto 2</elemento2>
</documento>
                

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE documento SYSTEM "archivo.dtd">
<documento>...</documento>
                

Elementos básicos

Declaración Descripción Ejemplo
ELEMENT Define elemento <!ELEMENT libro (titulo, autor)>
ATTLIST Define atributos <!ATTLIST libro isbn CDATA #REQUIRED>
ENTITY Define entidades <!ENTITY editorial "XYZ">

Cardinalidad

Símbolo Significado Ejemplo
(Sin símbolo) Una vez <!ELEMENT libro (titulo)>
? Cero o una <!ELEMENT libro (subtitulo?)>
* Cero o más <!ELEMENT libro (autor*)>
+ Una o más <!ELEMENT biblioteca (libro+)>

Operadores

Operador Descripción Ejemplo
, Secuencia <!ELEMENT libro (titulo, autor)>
| Selección <!ELEMENT publicacion (libro | revista)>

Tipos de contenido

Tipo Descripción Ejemplo
#PCDATA Texto analizado <!ELEMENT titulo (#PCDATA)>
EMPTY Elemento vacío <!ELEMENT imagen EMPTY>
ANY Cualquier contenido <!ELEMENT descripcion ANY>

Atributos

Tipo Descripción Ejemplo
CDATA Caracteres <!ATTLIST libro isbn CDATA #REQUIRED>
ID Identificador único <!ATTLIST elemento id ID #REQUIRED>
IDREF Referencia a ID <!ATTLIST elemento ref IDREF #IMPLIED>
IDREFS Múltiples IDs <!ATTLIST elemento refs IDREFS #IMPLIED>
NMTOKEN Nombre XML <!ATTLIST elemento token NMTOKEN #IMPLIED>
NMTOKENS Nombres XML <!ATTLIST elemento tokens NMTOKENS #IMPLIED>
ENTITY Entidad <!ATTLIST elemento ent ENTITY #IMPLIED>
ENTITIES Múltiples entidades <!ATTLIST elemento ents ENTITIES #IMPLIED>
(valor1|valor2) Enumeración <!ATTLIST libro tipo (Ficción|NoFicción) #REQUIRED>

Restricciones

Restricción Descripción Ejemplo
#REQUIRED Obligatorio <!ATTLIST libro isbn CDATA #REQUIRED>
#IMPLIED Opcional <!ATTLIST autor nacionalidad CDATA #IMPLIED>
#FIXED "valor" Valor fijo <!ATTLIST documento version CDATA #FIXED "1.0">
"valor predeterminado" Valor por defecto <!ATTLIST libro formato CDATA "tapa blanda">

Ejemplo: Orden de compra


<!-- orden.dtd -->
<!ELEMENT OrdenCompra (Cliente, Items)>
<!ELEMENT Cliente (Nombre, Direccion)>
<!ELEMENT Nombre (#PCDATA)>
<!ELEMENT Direccion (#PCDATA)>
<!ELEMENT Items (Item+)>
<!ELEMENT Item (Producto, Cantidad, Precio)>
<!ELEMENT Producto (#PCDATA)>
<!ELEMENT Cantidad (#PCDATA)>
<!ELEMENT Precio (#PCDATA)>
<!ATTLIST OrdenCompra id ID #REQUIRED>
<!ATTLIST Item codigo CDATA #REQUIRED>
                    

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE OrdenCompra SYSTEM "orden.dtd">
<OrdenCompra id="OC001">
  <Cliente>
    <Nombre>María Gómez</Nombre>
    <Direccion>Calle Principal 123</Direccion>
  </Cliente>
  <Items>
    <Item codigo="P001">
      <Producto>Laptop</Producto>
      <Cantidad>2</Cantidad>
      <Precio>1200.00</Precio>
    </Item>
    <Item codigo="P002">
      <Producto>Mouse</Producto>
      <Cantidad>5</Cantidad>
      <Precio>25.00</Precio>
    </Item>
  </Items>
</OrdenCompra>
                    

Práctica

Crea una DTD para un sistema de reservas de hotel. Valida un XML.

XSD (XML Schema Definition)

¿Qué es?

XSD ofrece validación avanzada para XML con tipos de datos y restricciones.

Ventajas

  • Tipos de datos avanzados
  • Namespaces completos
  • Cardinalidad precisa
  • Tipos reutilizables
  • Validaciones avanzadas

Estructura


<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <!-- Definiciones -->
</xs:schema>
                

Vinculación


<?xml version="1.0" encoding="UTF-8"?>
<biblioteca
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:noNamespaceSchemaLocation="biblioteca.xsd">
  <!-- Contenido -->
</biblioteca>
                

Elementos

Elemento Descripción Ejemplo
<xs:element> Elemento <xs:element name="libro" type="xs:string"/>
<xs:attribute> Atributo <xs:attribute name="isbn" type="xs:string"/>
<xs:complexType> Tipo complejo <xs:complexType name="TipoLibro">...</xs:complexType>
<xs:simpleType> Tipo simple <xs:simpleType name="TipoISBN">...</xs:simpleType>
<xs:sequence> Secuencia <xs:sequence><xs:element name="titulo"/>...</xs:sequence>
<xs:choice> Elección <xs:choice><xs:element name="libro"/>...</xs:choice>
<xs:all> Cualquier orden <xs:all><xs:element name="autor"/>...</xs:all>

Atributos

Atributo Descripción Ejemplo
name Nombre name="libro"
type Tipo type="xs:string"
minOccurs Mínimo minOccurs="0"
maxOccurs Máximo maxOccurs="unbounded"
use Uso use="required"
default Por defecto default="tapa blanda"
fixed Fijo fixed="1.0"

Tipos de datos

Tipo Descripción Ejemplo
xs:string Cadena "Texto"
xs:integer Entero 42
xs:decimal Decimal 3.14
xs:date Fecha 2023-05-15
xs:time Hora 14:30:00
xs:dateTime Fecha y hora 2023-05-15T14:30:00
xs:boolean Booleano true

Restricciones

Restricción Descripción Ejemplo
minLength Longitud mínima <xs:minLength value="3"/>
maxLength Longitud máxima <xs:maxLength value="50"/>
pattern Regex <xs:pattern value="[A-Z][0-9]{3}"/>
enumeration Valores <xs:enumeration value="novela"/>
minInclusive Mínimo <xs:minInclusive value="1"/>
maxInclusive Máximo <xs:maxInclusive value="100"/>

Ejemplo: Orden de compra


<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:simpleType name="TipoCodigo">
    <xs:restriction base="xs:string">
      <xs:pattern value="[A-Z]{1}\d{3}"/>
    </xs:restriction>
  </xs:simpleType>
  <xs:complexType name="TipoCliente">
    <xs:sequence>
      <xs:element name="Nombre" type="xs:string"/>
      <xs:element name="Direccion" type="xs:string"/>
    </xs:sequence>
  </xs:complexType>
  <xs:complexType name="TipoItem">
    <xs:sequence>
      <xs:element name="Producto" type="xs:string"/>
      <xs:element name="Cantidad" type="xs:positiveInteger"/>
      <xs:element name="Precio" type="xs:decimal"/>
    </xs:sequence>
    <xs:attribute name="codigo" type="TipoCodigo" use="required"/>
  </xs:complexType>
  <xs:element name="OrdenCompra">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="Cliente" type="TipoCliente"/>
        <xs:element name="Items">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="Item" type="TipoItem" maxOccurs="unbounded"/>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
      <xs:attribute name="id" type="xs:ID" use="required"/>
    </xs:complexType>
  </xs:element>
</xs:schema>
                    

<?xml version="1.0" encoding="UTF-8"?>
<OrdenCompra
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:noNamespaceSchemaLocation="orden.xsd"
  id="OC001">
  <Cliente>
    <Nombre>María Gómez</Nombre>
    <Direccion>Calle Principal 123</Direccion>
  </Cliente>
  <Items>
    <Item codigo="P001">
      <Producto>Laptop</Producto>
      <Cantidad>2</Cantidad>
      <Precio>1200.00</Precio>
    </Item>
    <Item codigo="P002">
      <Producto>Mouse</Producto>
      <Cantidad>5</Cantidad>
      <Precio>25.00</Precio>
    </Item>
  </Items>
</OrdenCompra>
                    

Práctica

Crea un XSD para eventos (fechas, asistentes). Valida un XML.

XPath (XML Path Language)

¿Qué es?

XPath consulta nodos en XML, usado en XSLT y XQuery.

Características

  • Rutas como directorios
  • Navegación jerárquica
  • Funciones para datos
  • Predicados de filtro

Sintaxis

Expresión Descripción Ejemplo
/ Raíz /biblioteca
// Cualquier nivel //libro
. Nodo actual ./titulo
.. Nodo padre ../autor
@ Atributos @isbn
* Comodín /biblioteca/*

Operadores

Operador Descripción Ejemplo
[ ] Predicado //libro[autor="Cervantes"]
| Unión //libro | //revista
and Y //libro[@año>2000 and @paginas<300]
or O //libro[@categoria="Ficción" or @categoria="Novela"]
not() Negación //libro[not(@categoria="Infantil")]

Funciones

Función Descripción Ejemplo
count() Cuenta count(//libro)
sum() Suma sum(//libro/@paginas)
contains() Contiene //libro[contains(titulo, "Quijote")]
starts-with() Comienza //libro[starts-with(titulo, "El")]

Ejemplo


<tienda>
  <producto categoria="Electrónica" id="P001">
    <nombre>Smartphone</nombre>
    <precio>599.99</precio>
    <stock>50</stock>
  </producto>
  <producto categoria="Electrónica" id="P002">
    <nombre>Laptop</nombre>
    <precio>1299.99</precio>
    <stock>20</stock>
  </producto>
</tienda>
                    
Consulta Resultado
/tienda/producto[@categoria="Electrónica"] Productos electrónicos
//producto[precio>1000]/nombre Nombres de productos caros

Práctica

Escribe consultas XPath para productos con stock < 30 y precios promedio.

XSLT (XSL Transformations)

¿Qué es?

XSLT transforma XML a otros formatos usando plantillas y XPath.

Estructura


<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="/">
    <html>
      <body>
        <xsl:apply-templates/>
      </body>
    </html>
  </xsl:template>
</xsl:stylesheet>
                

Ejemplo: XML a HTML


<biblioteca>
  <libro>
    <titulo>Don Quijote</titulo>
    <autor>Cervantes</autor>
  </libro>
</biblioteca>
                    

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="/">
    <html>
      <body>
        <h1>Biblioteca</h1>
        <xsl:for-each select="biblioteca/libro">
          <p><xsl:value-of select="titulo"/> - <xsl:value-of select="autor"/></p>
        </xsl:for-each>
      </body>
    </html>
  </xsl:template>
</xsl:stylesheet>
                    

Práctica

Crea un XSLT para transformar un XML de productos en una tabla HTML.

JSON (JavaScript Object Notation)

Historia

JSON, creado en los 2000, es popular en APIs REST.

Características

  • Sintaxis ligera
  • Independiente
  • Procesamiento rápido
  • Menor sobrecarga

Estructura


{
  "nombre": "Juan Pérez",
  "edad": 30,
  "activo": true,
  "intereses": ["programación", "música"],
  "contacto": {
    "email": "juan@ejemplo.com",
    "telefono": "123-456-789"
  },
  "hijos": null
}
                

Tipos de datos

Tipo Descripción Ejemplo
String Cadena "Hola"
Number Número 42
Boolean true/false true
null Nulo null
Array Lista ["a", "b"]
Object Clave-valor {"key": "value"}

Reglas

  • Claves en comillas dobles
  • Valores: strings, números, booleanos, null, arrays, objetos
  • Separación por comas
  • No comas finales
  • No comentarios

Ejemplo: API


{
  "orden": {
    "id": "OC001",
    "cliente": {
      "nombre": "María Gómez",
      "direccion": "Calle Principal 123"
    },
    "items": [
      {
        "codigo": "P001",
        "producto": "Laptop",
        "cantidad": 2,
        "precio": 1200.00
      },
      {
        "codigo": "P002",
        "producto": "Mouse",
        "cantidad": 5,
        "precio": 25.00
      }
    ],
    "total": 2425.00
  }
}
                    

Práctica

Convierte el XML de orden de compra a JSON.

JSON Schema

¿Qué es?

JSON Schema valida documentos JSON, similar a XSD.

Estructura


{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "type": "object",
  "properties": {},
  "required": []
}
                

Ejemplo: Orden


{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "type": "object",
  "properties": {
    "orden": {
      "type": "object",
      "properties": {
        "id": { "type": "string", "pattern": "^OC\\d{3}$" },
        "cliente": {
          "type": "object",
          "properties": {
            "nombre": { "type": "string" },
            "direccion": { "type": "string" }
          },
          "required": ["nombre", "direccion"]
        },
        "items": {
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "codigo": { "type": "string" },
              "producto": { "type": "string" },
              "cantidad": { "type": "integer", "minimum": 1 },
              "precio": { "type": "number", "minimum": 0 }
            },
            "required": ["codigo", "producto", "cantidad", "precio"]
          }
        },
        "total": { "type": "number", "minimum": 0 }
      },
      "required": ["id", "cliente", "items", "total"]
    }
  },
  "required": ["orden"]
}
                    

Práctica

Crea un JSON Schema para tareas (prioridades, fechas).

Comparativas

XML vs JSON

Característica XML JSON
Sintaxis Verbose Concisa
Tamaño Mayor Ligero
Validación Robusta Básica
Namespaces Soportado No
Casos SOAP, documentos APIs REST

DTD vs XSD

Característica DTD XSD
Sintaxis No XML XML
Tipos Limitados Extensos
Namespaces Limitado Completo
Validaciones Básicas Avanzadas

Resumen

XML para documentos complejos, JSON para APIs. DTD simple, XSD potente.

Casos de uso

RSS (XML)


<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>Blog</title>
    <item>
      <title>Artículo</title>
      <pubDate>2025-04-23</pubDate>
    </item>
  </channel>
</rss>
                

API REST (JSON)


{
  "users": [
    {
      "id": 1,
      "name": "Ana",
      "email": "ana@example.com"
    }
  ]
}
                

Recursos