Documentos de Académico
Documentos de Profesional
Documentos de Cultura
PHP y XML
Introducción Página 1 de 1
PHP y XML
eXtensible Markup Language
Introducción
P HP5 proporciona varias extensiones del lenguaje (módulos de software) que permiten implementar analizadores
gramaticales de documentos XML. Estos analizadores, también conocidos como procesadores o parsers XML, permiten
a las aplicaciones el acceso a la estructura y el contenido de este tipo de documentos. Haciendo uso del conjunto de
funciones proporcionadas por PHP, podemos definir scripts que interpreten nuestros documentos XML.
E ste capítulo no pretende ser un resumen exhaustivo de estas tecnologías, simplemente muestra una
aproximación a las mismas presentando ejemplos tipo con los tres procesadores de XML principales que presenta
PHP5: SimpleXML, SAX (Simple API for XML) y DOM (Document Object Model).
ANTECEDENTES
L a relación entre PHP y XML comienza en PHP3, pues esta versión (en la 3.0.6) ya contaba con una extensión
para SAX soportada por la librería expat de James Clark. Las extensiones para SimpleXML y para el DOM soportadas
por la librería libxml2 (la librería de XML de GNOME) tuvieron que esperar hasta la versión 4. De este modo, PHP4
incorporaba tres modos diferentes de trabajar con los documentos XML, si bien, la extensión más utilizada fue la de SAX
(incluida por defecto en la versión Win32 de PHP4) porque SimpleXML y DOM siempre fueron extensiones
experimentales, es decir, propensas a cambios y modificaciones sin previo aviso, lo que hizo que los desarrolladores no
las usaran ampliamente.
P ara obtener más información sobre libxml2, se puede recurrir a la dirección http://www.xmlsoft.org/.
Más información sobre expat, en la dirección http://www.jclark.com/xml/expat.html.
La extensión para SAX proporcionaba un procesador XML orientado a eventos. El trabajo con SAX era
relativamente sencillo, consistía en recorrer linealmente todo el documento XML llamando a funciones,
especificadas por el programador, ante ciertos eventos normalmente asociados a la apertura y cierre de
etiquetas o a la aparición de determinados componentes. El principal inconveniente que presentaba SAX es
que no nos proveía de una forma de validar el documento respecto a una DTD. Y que no permitía modificar
el documento con el que se estaba trabajando.
La extensión DOM de PHP proporcionaba un procesador XML completo, permitía validar un documento
respecto a una DTD, que transformaba el documento XML en una estructura de árbol que seguía de forma
aproximada el modelo de objetos de documento del W3C. El problema principal de esta extensión, además
de su carácter experimental, era que hacía uso de funciones no presentes en el estándar y que no podía
dar algunas de las prestaciones especificadas en el DOM, principalmente por la naturaleza del trabajo con
objetos en PHP4.
S in embargo en PHP5 se han reescrito completamente las funcionalidades de XML, haciendo uso de la librería
libxml2, para dar soporte tanto a SimpleXML y DOM como a SAX. La nueva extensión del DOM sigue completamente
el estándar publicado por el W3C y además las nuevas extensiones de SimpleXML y DOM tienen interfaces para
compartir información.
PHP y XML
eXtensible Markup Language
DOM: Document Object Model
E l DOM, Document Object Model o modelo de objetos de documento, se originó como una especificación que
permitiera a los scripts Javascript y a los programas Java ser portables entre los diferentes navegadores Web. Podemos
considerar, por tanto, al HTML dinámico o DHTML como su antedecesor. Pero ha evolucionado hasta convertirse en una
interfaz estándar para la programación de aplicaciones (API) orientadas a trabajar con documentos HTML y documentos
XML bien formados. El DOM define la estructura lógica de los documentos y el modo en que pueden ser accedidos y
manipulados. De este modo, los programadores pueden definir documentos, navegar a través de su estructura y añadir,
modificar o eliminar sus componentes y/o contenidos. Este modelo puede ser utilizado en una gran variedad de entornos
y aplicaciones, pues es independiente de la plataforma y del lenguaje de desarrollo.
A través del DOM cualquier documento HTML o XML bien formado puede verse como una estructura de tipo
arborescente, en la que cada nodo del árbol representa a un componente del documento. Además, cada elemento se
modela utilizando objetos (de ahí el nombre de modelo de objetos), es decir, los nodos del árbol que representan al
documento no hacen referencia a estructuras de datos sino a objetos que tienen métodos y propiedades. Como modelo
de objetos el DOM identifica:
T al como hemos indicado anteriormente, el DOM representa los documentos como una jerarquía de distintos
de nodos. Todo documento tendrá un nodo raíz, diferentes nodos hijos y lo que se denomina nodos hoja o nodos finales
(aquellos que no tienen nodos hijos).
E n esta sección se muestran algunas de las interfaces más importantes del DOM, si bien éste cuenta con un
juego mucho más amplio.
P ara obtener más información sobre DOM y tecnologías afines, se puede recurrir a la dirección
http://www.w3.org/TR/DOM-Level-3-Core .
INTERFAZ NODE
E n general a cada tipo de nodo le va a corresponder un tipo de objeto y un tipo de interfaz específica, sin
embargo, existe una interfaz primaria, la interfaz node que es implementada por la mayor parte de los componentes del
DOM.
PROPIEDADES:
attributes: colección de nodos (interfaz NamedNodeMap) que contiene los atributos del nodo actual.
baseURI: URI de la base absoluta del nodo actual o null si no está definido.
nodeValue: valor del nodo actual, dependerá del tipo de nodo. La siguiente tabla muestra cómo varían los
valores de nodeName, nodeType y nodeValue en función del tipo de nodo:
nodo de texto
prefix: prefijo del espacio de nombres utilizado por el nodo actual, si no está definido devuelve null.
MÉTODOS:
appendChild(nodo): añade el nodo proporcionado al final de la lista de hijos del nodo actual. Si el nuevo
hijo ya existe en dicha lista primero se elimina.
cloneNode(clonar_hijos): devuelve una copia del nodo actual. Si clonar_hijos es true, también se
clona el subárbol bajo el nodo actual.
getUserData(clave): devuelve el objeto asociado a la clave indicada dentro del nodo actual (ver
setUserData()).
insertBefore(nodo_ins, nodo_ref): inserta el nodo_ins antes del nodo_ref. Si este último nodo no
existe, nodo_ins se inserta la final de la lista de nodos hijos del nodo actual. Si nodo_ins es de tipo
DOCUMENT_FRAGMENT_NODE todos sus nodos hijos serán insertados en el orden en que aparecen. Si
nodo_ins existe actualmente en el subárbol del nodo actual primero es eliminado.
normalize(): une todos los nodos de texto adyacentes (interfaz Text) del nodo actual, en un solo nodo
por cada bloque de texto.
removeChild(nodo): elimina el nodo hijo pasado como parámetro de la lista de nodos hijos del nodo
actual. Devuelve el nodo hijo eliminado.
setUserData(clave, objeto, manejador): asocia a un objeto del nodo actual una clave. Se puede
indicar el manejador asociado a la clave. Si el objeto pasado es null se eliminará cualquier asociación
existente con la clave dada (ver getUserData()).
INTERFAZ DOCUMENT
L a interfaz Document representa al documento XML o HTML completo. Conceptualmente es el nodo raíz del
árbol que representa al documento. El resto de los diferentes tipos de nodos no pueden existir fuera del contexto de un
documento. Además esta interfaz contiene los métodos necesarios para poder crear los diferentes tipos de nodos.
Extiende la interfaz node.
PROPIEDADES:
actualEncoding: codificación actual del documento o null en caso de que ésta no exista.
doctype: DTD, tipo del documento, asociado con el documento actual. En caso de que no exista devuelve
null.
documentElement: proporciona un acceso directo al nodo raíz del árbol que representa al documento, al
elemento principal (document element) del documento actual.
encoding: valor del atributo encoding de la declaración xml, con la codificación del documento o null en
caso de que éste no exista.
implementation: objeto con la implementación actual del DOM que está siendo utilizada.
standalone: valor del atributo standalone de la declaración xml, o null en caso de que éste no exista.
version: valor del atributo version de la declaración xml, con la versión del documento o null en caso de
que éste no exista.
MÉTODOS:
adoptNode(nodo): cambia la propiedad ownerDocument del nodo proporcionado y de todos sus nodos
createAttribute(nombre): crea un nuevo nodo de tipo atributo (interfaz Attr) con el nombre dado.
Esta nueva instancia deberá ser asignada a un elemento (interfaz Element) utilizando el método
setAttributeNode().
createComment(cadena): crea un nodo de tipo comentario (interfaz Comment) con el valor especificado
en la cadena proporcionada.
createElement(nombre): crea un nodo de tipo elemento (interfaz Element) cuyo atributo nodeName es
nombre.
createTextNode(cadena): crea un nodo de tipo texto (interfaz Text) cuyo valor es la cadena dada.
getElementsByTagName(nombre): devuelve una lista de nodos (interfaz nodeList) con los elementos
cuyo nombre de etiqueta coincida con el nombre proporcionado. El valor especial [*] hace referencia a
todas las etiquetas.
importNode(nodo, importar_hijos): importa un nodo desde otro documento, creando una copia del
nodo original. El nodo devuelto no tiene padre. Si importar_hijos es true se importarán todos los hijos del
nodo seleccionado.
normalizeDocument(): une todos los nodos de texto adyacentes (interfaz Text) del documento actual
en un solo nodo por cada bloque de texto.
INTERFAZ ELEMENT
L a interfaz Element representa a los elementos básicos que configuran los documentos XML o HTML, es decir,
cada uno de los componentes delimitados por etiquetas de apertura y cierre o etiquetas vacías. Extiende Interfaz node.
PROPIEDADES:
MÉTODOS:
getAttribute(nombre): devuelve el valor del atributo cuyo nombre coincide con el proporcionado o la
cadena vacía en caso de que no esté especificado su valor.
getElementsByTagName(nombre): devuelve una lista de nodos (interfaz nodeList) con los elementos
cuyo nombre de etiqueta coincida con el nombre proporcionado. El valor especial [*] hace referencia a
todas las etiquetas.
hasAttribute(nombre): devuelve true si el elemento presenta un atributo cuyo nombre coincide con el
proporcionado o dicho atributo tiene asociado un valor por defecto en el DTD asociado.
setAttributeNode(nodo): crea un nuevo nodo de tipo atributo (interfaz Attr). Si actualmente existe un
nodo atributo con igual valor en el atributo nodeName es reemplazado.
setAttributeNodeNS(nodo): crea un nuevo nodo de tipo atributo (interfaz Attr). Si actualmente existe
un nodo atributo con el mismo nombre local y espacio de nombres es reemplazado.
setIdAttribute(nombre, esID): indica, si el parámetro esID vale true, que el atributo especificado
por el nombre proporcionado es de tipo ID. Si el valor especificado en el atributo es único, el elemento
podrá ser recuperado posteriormente haciendo uso del método getElementsById() presente en el
documento (interfaz Document) que lo contiene.
INTERFAZ ATTR
L a interfaz Attr representa un atributo dentro de un objeto de tipo Element. Típicamente los valores permitidos
para el atributo estarán definidos dentro de un DTD. Extiende la interfaz node, pero como los atributos no tienen
actualmente nodos hijos, el DOM no los considera como parte del árbol del documento, sino que los considera como
propiedades de los elementos. Por ello, los atributos heredados parentNode, previousSibling y nextSibling
tienen el valor null en los objetos de tipo Attr.
PROPIEDADES:
ownerElement: nodo asociado al elemento (interfaz Element) en el cual está presente el atributo actual.
value: valor del atributo. Los caracteres y las referencias a entidades generales son reemplazadas por sus
correspondientes valores.
MÉTODOS:
INTERFAZ PROCESSINGINSTRUCTION
PROPIEDADES:
INTERFAZ CHARACTERDATA
E xtiende la interfaz node añadiendo un conjunto de atributos y métodos para facilitar el manejo de datos de tipo
carácter. No existen en el DOM objetos directamente definidos a partir de esta interfaz, es extendida a su vez por otros
componentes del DOM.
PROPIEDADES:
data: los datos de tipo carácter presentes en el nodo que implementa esta interfaz. El DOM no pone
límites a la cantidad de datos que se pueden almacenar en un nodo de este tipo.
MÉTODOS:
appendData(cadena): añade la cadena proporcionada al final de los datos de tipo carácter del nodo.
deleteData(desplazamiento, cuenta): elimina, de los datos de tipo carácter del nodo, el número de
caracteres fijados por cuenta a partir de la posición indicada por desplazamiento.
insertData(desplazamiento, cadena): añade, a los datos de tipo carácter del nodo, la cadena
proporcionada a partir de la posición indicada por desplazamiento.
substringData(desplazamiento, cuenta): extrae, de los datos de tipo carácter del nodo, el número
de caracteres fijados por cuenta a partir de la posición indicada por desplazamiento.
INTERFAZ TEXT