Foros del Web » Programando para Internet » PHP »

Cerrar nodos de un XML con PHP y MySQL

Estas en el tema de Cerrar nodos de un XML con PHP y MySQL en el foro de PHP en Foros del Web. Saludos a todos! Estoy desarrollando un pequeño sistema de inventarios en Flex, PHP y MySQ en el cual tengo en mi base de datos una ...
  #1 (permalink)  
Antiguo 24/01/2011, 16:39
Avatar de heberto  
Fecha de Ingreso: septiembre-2004
Ubicación: Morelia, Michoacán
Mensajes: 104
Antigüedad: 19 años, 7 meses
Puntos: 0
Pregunta Cerrar nodos de un XML con PHP y MySQL

Saludos a todos!

Estoy desarrollando un pequeño sistema de inventarios en Flex, PHP y MySQ en el cual tengo en mi base de datos una tabla con las categorias de los articulos registrados en dicho inventario. En la misma tabla tengo la relacion de las subcategorias de cada categoria. He desarrollado un script de PHP el cual me debe de generar un XML con las categorias registradas en el sistema. Dicho XML será leido por Flex y desplegarlo en un componente Tree. Basicamente el problema lo tengo al momento de querer cerrar los nodos del XML en mi script de PHP alguien me puede ayudar en esto por favor? ya le di muchas vueltas y me he ciclado y no saco una solución. De antemano muchas gracias por su atención. Anexo el codigo y estructura de la BD

Tabla en mi base de datos...
Código:
CREATE TABLE `Categorias` (
  `IdCategoria` double NOT NULL AUTO_INCREMENT,
  `IdCatPadre` double NOT NULL,
  `Categoria` varchar(100) NOT NULL,
  PRIMARY KEY (`IdCategoria`)
)
El código de mi archivo PHP. La conexion con la BD la hago en el archivo conexion.php
En este codigo solo consulto 3 niveles de profundidad. ¿Es posible hacer la busqueda de forma dinamica?

Código PHP:
<?php require_once('../Connections/conexion.php'); ?>
 
<?php 
   $nivel_max 
3
   
$campos ""
   for(
$i=0;$i<$nivel_max;$i++){ 
      
$campos.= "t$i.IdCategoria AS IdCatNivel$i,t$i.categoria AS CatNivel$i,t$i.IdCatPadre AS IdPadreNivel$i"
      if(
$i!=$nivel_max-1){ 
         
$campos.= ","
      } 
   } 
    
   
$sql "SELECT $campos "
   
$sql .= "FROM Categorias AS t0 "
   for(
$i=1;$i<$nivel_max;$i++){ 
      
$sql .= "LEFT JOIN Categorias AS t$i ON t$i.IdCatPadre = t".($i-1).".IdCategoria "
   } 
   
$sql .= "WHERE t0.IdCatPadre =  '0'"
 
   
mysql_select_db($database_conexion$conexion); 
   
$query_rsCategorias $sql
   
$rsCategorias mysql_query($query_rsCategorias$conexion) or die(mysql_error()); 
   
$row_rsCategorias mysql_fetch_assoc($rsCategorias); 
   
$totalRows_rsCategorias mysql_num_rows($rsCategorias); 
    
   
$xml ""
   
$error 0
    
   
$temp = array(); 
   for(
$i=0;$i<$nivel_max;$i++){ 
      
$temp[$i] = ""
      
$cierre[$i] = true
   } 
    
   if(
$totalRows_rsCategorias 0){ 
       
      do{ 
         for(
$i=0;$i<$nivel_max;$i++){ 
            
$item $row_rsCategorias['CatNivel'.$i]; 
            
$sangria ""
            for(
$j=0;$j<$i;$j++){ 
               
$sangria.= "\t";  
            } 
             
            if(
$item != ""){ 
               if(
$temp[$i] != $item){ 
                  
$temp[$i] = $item
                  
$xml.= "\n".$sangria."<item label=\"".$temp[$i]."\">"
                  if(
$i == ($nivel_max-1)){ 
                     
$xml.= "</item>"
                  }else{ 
                      
                  } 
               }else{ 
                   
               } 
            }else{ 
               
$xml.= "</item>"
               break; 
            } 
             
         }    
      }while(
$row_rsCategorias mysql_fetch_assoc($rsCategorias)); 
   }else{ 
      
$error 1
   } 
    
   
header("Content-type: text/xml"); 
   echo 
"<?xml version=\"1.0\" encoding=\"iso-8859-1\"?>\n"
   echo 
$xml
?>
y este es el resultado que me genera....
Código:
<?xml version="1.0" encoding="iso-8859-1"?>  
<item label="Ropa">  
   <item label="Tops">  
      <item label="Blusas"></item>  
      <item label="Playeras"></item>  
      <item label="Chaleco"></item>  
   <item label="Faldas">  
      <item label="Faldas cortas"></item>  
      <item label="Faldas largas"></item>  
   <item label="Vestidos">  
      <item label="Cocktail"></item>  
      <item label="Casual"></item>  
   <item label="Pantalones y Shorts">  
      <item label="Pesquero"></item>  
      <item label="Jeans"></item>  
   <item label="Chamarras y abrigos">  
      <item label="Saco"></item>  
      <item label="Blazer"></item>  
<item label="Zapatos">  
   <item label="Botas"></item>  
   <item label="Tacones"></item>  
   <item label="Sandalias"></item>  
   <item label="Plataformas"></item>  
   <item label="Suecos"></item>  
   <item label="Flats"></item>  
<item label="Accesorios">  
   <item label="Cabello"></item>  
   <item label="Aretes"></item>  
   <item label="Collares"></item>  
   <item label="Cinturón"></item>  
   <item label="Pulseras"></item>  
   <item label="Anillos"></item>  
<item label="Bolsas"></item>  
<item label="Productos únicos"></item>  
<item label="Arte">  
   <item label="Pinturas"></item>  
   <item label="Esculturas"></item>  
   <item label="Fotografía"></item>
__________________
Atte.

Ing. Julio Heberto Gonzalez Morales
Certified Macromedia Flash MX Designer
  #2 (permalink)  
Antiguo 24/01/2011, 20:35
Avatar de pacmanaman  
Fecha de Ingreso: marzo-2009
Mensajes: 84
Antigüedad: 15 años, 1 mes
Puntos: 3
Respuesta: Cerrar nodos de un XML con PHP y MySQL

Código PHP:
Ver original
  1. <?php
  2. /*
  3.  * Funcion para transformar un resultado de mysql en un archivo XML
  4.  **/
  5. function mysql_XML($resultado, $nombreDoc='tbl_usuarios', $nombreItem='usuario') {
  6.    $campo = array();
  7.    
  8.    // llenamos el array de nombres de campos
  9.    for ($i=0; $i<mysql_num_fields($resultado); $i++)
  10.       $campo[$i] = mysql_field_name($resultado, $i);
  11.    
  12.    // creamos el documento XML    
  13.    $dom = new DOMDocument('1.0', 'UTF-8');
  14.    $doc = $dom->appendChild($dom->createElement($nombreDoc));
  15.    
  16.    // recorremos el resultado
  17.    for ($i=0; $i<mysql_num_rows($resultado); $i++) {
  18.        
  19.       // creamos el item
  20.       $nodo = $doc->appendChild($dom->createElement($nombreItem));
  21.        
  22.       // agregamos los campos que corresponden
  23.       for ($b=0; $b<count($campo); $b++) {
  24.          $campoTexto = $nodo->appendChild($dom->createElement($campo[$b]));
  25.          $campoTexto->appendChild($dom->createTextNode(mysql_result($resultado, $i, $b)));
  26.       }
  27.    }
  28.    
  29.    // retornamos el archivo XML como cadena de texto
  30.    $dom->formatOutput = true;  
  31.    return $dom->saveXML();    
  32.  }
  33.  
  34. $con = mysql_connect("server","user","pass");
  35. mysql_select_db("BASE",$con);
  36. $resultado = mysql_query('SELECT * FROM usuarios');
  37. header ('Content-type: text/xml');
  38. echo mysql_XML($resultado);  
  39. ?>
Fuente: http://www.cristalab.com/tutoriales/...n-php-c68404l/
__________________
(<++
  #3 (permalink)  
Antiguo 25/01/2011, 14:25
Avatar de heberto  
Fecha de Ingreso: septiembre-2004
Ubicación: Morelia, Michoacán
Mensajes: 104
Antigüedad: 19 años, 7 meses
Puntos: 0
De acuerdo Respuesta: Cerrar nodos de un XML con PHP y MySQL

Muchas gracias pacmanaman por tu respuesta, no la implemente tal como me la pusiste en el ejemplo, pero en base a ello pude generar el script que me da por resultado el XML que necesito.

Mi aporte con la solución....

Código PHP:
<?php require_once('../Connections/conexion.php'); ?>
<?php
    $nivel_max 
3;
    
$campos "";
    for(
$i=0;$i<$nivel_max;$i++){
        
$campos.= "t$i.IdCategoria AS IdCatNivel$i,t$i.categoria AS CatNivel$i,t$i.IdCatPadre AS IdPadreNivel$i";
        if(
$i!=$nivel_max-1){
            
$campos.= ",";
        }
    }
    
    
$sql "SELECT $campos ";
    
$sql .= "FROM Categorias AS t0 ";
    for(
$i=1;$i<$nivel_max;$i++){
        
$sql .= "LEFT JOIN Categorias AS t$i ON t$i.IdCatPadre = t".($i-1).".IdCategoria ";
    }
    
$sql .= "WHERE t0.IdCatPadre =  '0'";
    
//echo $sql;
    
    
mysql_select_db($database_conexion$conexion);
    
$query_rsCategorias $sql;
    
$rsCategorias mysql_query($query_rsCategorias$conexion) or die(mysql_error());
    
$row_rsCategorias mysql_fetch_assoc($rsCategorias);
    
$totalRows_rsCategorias mysql_num_rows($rsCategorias);
    
    
// CREACION DEL DOCUMENTO XML
    
$dom = new DOMDocument('1.0','UTF-8');
        
    
// ESCRITURA DEL NODO RAIZ CON SUS ATRIBUTOS
    
$nodo0 $dom->appendChild($dom->createElement('item'));
    
$atributo_id $dom->createAttribute('id');
    
$texto_id $dom->createTextNode('0');
    
$atributo_id->appendChild($texto_id);
    
    
$atributo_label $dom->createAttribute('label');
    
$texto_label $dom->createTextNode('La ciruela');
    
$atributo_label->appendChild($texto_label);
    
    
$nodo0->appendChild($atributo_id);
    
$nodo0->appendChild($atributo_label);
    
    
// ESCRITURA DE LOS NODOS SECUNDARIOS
    
if($totalRows_rsCategorias 0){
        do{
            for(
$i=0;$i<$nivel_max;$i++){
                
$item $row_rsCategorias['CatNivel'.$i];
                if(
$item != ""){
                    if(!isset(${
'item_nivel_'.$i})) ${'item_nivel_'.$i} = "";
                    if(${
'item_nivel_'.$i} != $item){
                        
$id $row_rsCategorias['IdCatNivel'.$i];
                        ${
'item_nivel_'.$i} = $item;
                        ${
'nodo'.($i+1)} = ${'nodo'.$i}->appendChild($dom->createElement('item'));
                        
                        
$atributo_id $dom->createAttribute('id');
                        
$texto_id $dom->createTextNode($id);
                        
$atributo_id->appendChild($texto_id);
                        
                        
$atributo_label $dom->createAttribute('label');
                        
$texto_label $dom->createTextNode(utf8_encode(${'item_nivel_'.$i}));
                        
$atributo_label->appendChild($texto_label);
    
                        ${
'nodo'.($i+1)}->appendChild($atributo_id);
                        ${
'nodo'.($i+1)}->appendChild($atributo_label);
                    }else{
                        
                    }
                }
            }
        }while(
$row_rsCategorias mysql_fetch_assoc($rsCategorias));
    }
    
    
$dom->formatOutput true;  
    
    
header("Content-type: text/xml");
    echo 
$dom->saveXML();
?>
__________________
Atte.

Ing. Julio Heberto Gonzalez Morales
Certified Macromedia Flash MX Designer

Etiquetas: categorias, mysql, xml, arboles
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 05:07.