DOM en PHP - Document Object Model
Manipula documentos XML y HTML como un profesional
🌳 ¿Qué es el DOM en PHP?
DOM (Document Object Model) es una extensión de PHP que permite manipular documentos XML y HTML como una estructura de árbol. Puedes navegar, modificar, agregar o eliminar elementos de manera programática.
📂 Lectura de XML con DOM
Ejemplo práctico usando el archivo ceramica.xml:
ceramica.xml
<?xml version="1.0" encoding="UTF-8"?>
<inventario>
<pieza id="10">
<nombre>Jarron minimalista</nombre>
<precio>55.055</precio>
</pieza>
</inventario>
Código PHP (lectura)
<?php
$dom = new DOMDocument();
$dom->load("ceramica.xml");
$piezas = $dom->getElementsByTagName("pieza");
foreach ($piezas as $pieza) {
$nombre = $pieza->getElementsByTagName("nombre")->item(0)->nodeValue;
$precio = $pieza->getElementsByTagName("precio")->item(0)->nodeValue;
echo "Producto: $nombre \nPrecio: $precio €\n";
}
?>
📊 Resultado de la ejecución:
🔧 Métodos Principales del DOM
Creación
new DOMDocument()createElement()createAttribute()createTextNode()
Búsqueda
getElementsByTagName()getElementById()getAttribute()item()
Modificación
nodeValue = "nuevo"setAttribute()appendChild()removeChild()
Guardado
save()saveXML()saveHTML()
💰 Ejemplo Interactivo: Actualizar Precios
El siguiente ejemplo incrementa el precio del producto en un 10%:
Antes de la actualización:
<?xml version="1.0"?>
Después (+10%):
<?xml version="1.0"?>
Código utilizado:
<?php
$dom = new DOMDocument();
$dom->load("ceramica.xml");
$piezas = $dom->getElementsByTagName("pieza");
foreach ($piezas as $pieza) {
// Obtener el precio actual
$precioNode = $pieza->getElementsByTagName("precio")->item(0);
$precioActual = $precioNode->nodeValue;
// Calcular nuevo precio (+10%)
$nuevoPrecio = $precioActual * 1.10;
// Actualizar el valor
$precioNode->nodeValue = $nuevoPrecio;
}
// Guardar los cambios
$dom->save("ceramica.xml");
echo "Archivo actualizado guardado correctamente.";
?>
🏗️ Estructura del DOM
Tipos de Nodos:
- Documento -
XML_DOCUMENT_NODE - Elemento -
XML_ELEMENT_NODE - Atributo -
XML_ATTRIBUTE_NODE - Texto -
XML_TEXT_NODE - Comentario -
XML_COMMENT_NODE
Propiedades importantes:
nodeName- Nombre del nodonodeValue- Valor del nodonodeType- Tipo de nodo (constante)parentNode- Nodo padrechildNodes- Nodos hijosattributes- Atributos del nodo
➕ Crear Nuevo XML desde Cero
<?xml version="1.0" encoding="UTF-8"?>
<biblioteca>
<libro id="1">
<titulo>El Quijote</titulo>
<autor>Miguel de Cervantes</autor>
<precio>29.99</precio>
</libro>
</biblioteca>
Código para crear el XML:
<?php
$dom = new DOMDocument('1.0', 'UTF-8');
$dom->formatOutput = true;
// Crear elemento raíz
$biblioteca = $dom->createElement('biblioteca');
$dom->appendChild($biblioteca);
// Crear elemento libro
$libro = $dom->createElement('libro');
$biblioteca->appendChild($libro);
// Agregar atributo id
$id = $dom->createAttribute('id');
$id->value = '1';
$libro->appendChild($id);
// Agregar elementos hijos
$titulo = $dom->createElement('titulo', 'El Quijote');
$libro->appendChild($titulo);
$autor = $dom->createElement('autor', 'Miguel de Cervantes');
$libro->appendChild($autor);
$precio = $dom->createElement('precio', '29.99');
$libro->appendChild($precio);
echo $dom->saveXML();
?>
⚖️ DOM vs Otros Métodos
| Método | Ventajas | Desventajas | Uso recomendado |
|---|---|---|---|
| DOM | ✅ Completo, lectura/escritura, navegación fácil | ❌ Consume mucha memoria con archivos grandes | Archivos XML/HTML pequeños/medianos |
| SimpleXML | ✅ Simple, fácil de usar | ❌ Limitado para modificaciones complejas | Lectura rápida de XML |
| XMLReader/XMLWriter | ✅ Bajo consumo de memoria | ❌ Más complejo de programar | Archivos XML muy grandes |
✏️ Área de Práctica DOM
XML de ejemplo:
Código PHP DOM:
Resultado:
Ejecuta el código para ver el resultado...
💡 Consejos para trabajar con DOM
Formato de salida
Usa $dom->formatOutput = true para obtener XML legible
Preservar espacios
$dom->preserveWhiteSpace = false para limpiar el XML
Validación
Usa $dom->validate() para validar contra DTD
XPath
Combina DOM con XPath para búsquedas más potentes
Manejo de errores
Usa libxml_use_internal_errors(true) para errores personalizados
Memoria
Para archivos muy grandes (>10MB), considera XMLReader