Para poder acceder a un documento XML con la librería
DOM, lo necesitamos hacer de esta forma
Código PHP:
Ver original<?php
header("Content-type: text/html; charset=utf-8"); $rss_forosdelweb = file_get_contents("http://www.forosdelweb.com/external.php?type=RSS2&forumids=18"); $xmlDOM = new DOMDocument();
$xmlDOM->loadXML($rss_forosdelweb);
Primero hemos almacenado la información del RSS en la variable
$rss_forosdelweb usando la función
file_get_contents. Creamos el objeto de DOMDocument y cargamos al objeto la información almacenada en la variable
$rss_forosdelweb. Para mostrar la información en pantalla usamos el método
saveXML. Si deseamos movernos en cada uno de los elementos podemos usar la propiedad
childNodes. Estaremos usando en este aporte las propiedas
nodeType,
nodeName,
nodeValue,
childNodes,
firstChild,
lastChild,
nextSibling,
previusSibling,
parentNode,
documentElement y
attributes.
- nodeType = Verificar cual es el tipo de nodo. El valor que publica esta variable es un número entero, y representa una constante predefinida.
- nodeName = Indica el nombre del nodo.
- nodeValue = Nos ofrece acceder a ciertos contenidos en los nodos. Nos permite ver atributos, secciones de CDATA, comentarios y texto.
- childNodes = Nos permite acceder a los nodos que son descendientes directos del nodo en que nos encontremos.
- firstChild = Nos permite acceder al primer descendiente directo del nodo en que nos encontramos.
- lastChild = Nos permite acceder al último descendiente directo del nodo en que nos encontramos.
- nextSibling = Nos permite acceder al siguiente elemento que está en el nodo donde nos encontramos.
- previusSibling = Nos permite acceder al elemento anterior que está en el nodo donde nos encontramos.
- parentNode = Nos permite acceder al nodo ascendiente directo del nodo en que nos encontramos.
- documentElement = Es más bien una forma de enfocarnos en el cuerpo de los elementos. Sin él, nos traerá también información del primer elemento, que en este caso es <rss...>
- attributes = Nos da la información de los atributos en un elemento.
Para poder acceder a cada uno de los elementos, podemos lograrlo de esta forma:
Código PHP:
Ver original<?php
header("Content-type: text/html; charset=utf-8"); $rss_forosdelweb = file_get_contents("http://www.forosdelweb.com/external.php?type=RSS2&forumids=18"); $xmlDOM = new DOMDocument();
$xmlDOM->loadXML($rss_forosdelweb);
$documentElement = $xmlDOM->documentElement;
foreach($documentElement->childNodes as $primera_gen){
if($primera_gen->nodeType != XML_TEXT_NODE){
echo $primera_gen->nodeName;
if($primera_gen->hasAttributes()){
foreach($primera_gen->attributes as $attr){
echo " [" . $attr->nodeName . "]";
}
}
echo "\n";
foreach($primera_gen->childNodes as $segunda_gen){
if($segunda_gen->nodeType != XML_TEXT_NODE){
echo "\t" . $segunda_gen->nodeName;
if($segunda_gen->hasAttributes()){
foreach($segunda_gen->attributes as $attr){
echo " [" . $attr->nodeName . "]";
}
}
echo "\n";
foreach($segunda_gen->childNodes as $tercera_gen){
if($tercera_gen->nodeType != XML_TEXT_NODE){
echo "\t\t" . $tercera_gen->nodeName;
if($tercera_gen->hasAttributes()){
foreach($tercera_gen->attributes as $attr){
echo " [" . $attr->nodeName . "]";
}
}
echo "\n";
foreach($tercera_gen->childNodes as $cuarta_gen){
if($cuarta_gen->nodeType != XML_TEXT_NODE){
echo "\t\t\t" . $cuarta_gen->nodeName;
if($cuarta_gen->hasAttributes()){
foreach($cuarta_gen->attributes as $attr){
echo " [" . $attr->nodeName . "]";
}
}
echo "\n";
if($cuarta_gen->firstChild->nextSibling->nodeType == XML_ELEMENT_NODE){
foreach($cuarta_gen->childNodes as $quinta_gen){
if($quinta_gen->nodeType != XML_TEXT_NODE){
echo "\t\t\t\t" . $quinta_gen->nodeName;
if($quita_gen->hasAttributes()){
foreach($quita_gen->attributes as $attr){
echo " [" . $attr->nodeName . "]";
}
}
echo "\n";
}
}
}
}
}
}
}
}
}
}
}
/**
* Adquirir la información con una función recursiva
* Info de función recursiva -> http://campusvirtual.unex.es/cala/epistemowikia/index.php?title=Funci%C3%B3n_recursiva
* Hace lo mismo que el ejemplo anterior
*/
header("Content-type: text/html; charset=utf-8"); $rss_forosdelweb = file_get_contents("http://www.forosdelweb.com/external.php?type=RSS2&forumids=18"); $xmlDOM = new DOMDocument();
$xmlDOM->loadXML($rss_forosdelweb);
$documentElement = $xmlDOM->documentElement;
/**
* Función para mostrar tabulado los elementos.
*/
function addTab($v,$n){
if($v->firstChild->nextSibling->nodeType == XML_ELEMENT_NODE || $v->firstChild->nodeType == XML_CDATA_SECTION_NODE){
return ++$n;
}
}
function searchElements($value, $n=0){
foreach($value->childNodes as $gen){
if($gen->nodeType != XML_TEXT_NODE){
echo str_pad("", $n, "\t") . $gen->nodeName; if($gen->hasAttributes()){
foreach($gen->attributes as $attr){
echo " [" . $attr->nodeName . "]";
}
}
echo "\n";
if($gen->firstChild->nextSibling->nodeType == XML_ELEMENT_NODE || $gen->firstChild->nodeType == XML_CDATA_SECTION_NODE){
searchElements($gen, addTab($gen,$n));
}
}
}
}
searchElements($documentElement);
Para poder acceder a los atributos, hemos primero verificado que existan usando el método
hasAttributes y si hay atributos, los mostramos con la propiedad
attributes.
Hemos estado verificando, antes del foreach, si el próximo nodo es del tipo
Texto o no, para poder continuar con el foreach (si no da un "Warning", para mayor detalle de los errores ver
este aporte). El motivo de estos
Textos es que se crea un espacio entre cada elemento. Cuando el DOM verifica el próximo nodo, encuentra que el próximo elemento es del tipo
Texto. Si los elementos se encuentre juntos no aparece el tipo texto. Esto se puede lograr haciendo un
preg_replace y remplazando los espacios que hay entre cada elemento. No es lo recomendable, ya que en este caso, se usan secciones de CDATA y estos contienen información en formato de HTML. Cuando el
preg_replace una los elementos, también afectará los que haya encontrado en el CDATA. Ejemplo de uso
Código PHP:
Ver original<?php
header("Content-type: text/html; charset=utf-8"); $rss_forosdelweb = file_get_contents("http://www.forosdelweb.com/external.php?type=RSS2&forumids=18"); $rss_forosdelweb = preg_replace("/\s*(<[^>]*>)\s*/","$1",$rss_forosdelweb); $xmlDOM = new DOMDocument();
$xmlDOM->loadXML($rss_forosdelweb);
$documentElement = $xmlDOM->documentElement;
/**
* Función para mostrar tabulado los elementos.
*/
function addTab($v,$n){
if($v->firstChild->nextSibling->nodeType == XML_ELEMENT_NODE || $v->firstChild->nodeType == XML_CDATA_SECTION_NODE){
return ++$n;
}
}
function searchElements($value, $n=0){
foreach($value->childNodes as $gen){
if($gen->nodeType != XML_TEXT_NODE){
echo str_pad("", $n, "\t") . $gen->nodeName; if($gen->hasAttributes()){
foreach($gen->attributes as $attr){
echo " [" . $attr->nodeName . "]";
}
}
echo "\n";
if($gen->firstChild->nextSibling->nodeType == XML_ELEMENT_NODE || $gen->firstChild->nodeType == XML_CDATA_SECTION_NODE){
searchElements($gen, addTab($gen,$n));
}
}
}
}
searchElements($documentElement);