- Formato universal de texto
- Independiente de plataforma
- Estructura jerárquica
- Etiquetas personalizadas
- Extensible
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:
- XMLeXtensible Markup Language: Lenguaje para estructurar datos con etiquetas personalizadas.: Lenguaje de marcado extensible.
- DTDDocument Type Definition: Define la estructura de un documento XML.: Validación básica de XML.
- XSDXML Schema Definition: Validación avanzada con tipos de datos.: Esquemas avanzados para XML.
- XPathXML Path Language: Consulta nodos en XML.: Consultas en documentos XML.
- XSLTXSL Transformations: Transforma XML a otros formatos.: Transformación de XML.
- JSON: Formato ligero de datos.
- JSON SchemaValida documentos JSON, similar a XSD.: Validación de JSON.
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
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
- Declarar con
xmlns:prefix="URI". - URI como identificador único.
- Namespace predeterminado con
xmlns="URI".
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"
}
]
}