Foros del Web » Programando para Internet » PHP »

Formatear lector xml con php

Estas en el tema de Formatear lector xml con php en el foro de PHP en Foros del Web. Hola gente. tengo un pequeño problema. dejo en claro desde el principio que soy diseñador y mis nociones de programación snn mas bien básicas. el ...
  #1 (permalink)  
Antiguo 23/06/2008, 20:59
Avatar de fullmental  
Fecha de Ingreso: octubre-2004
Ubicación: México DF, Xochimilco
Mensajes: 593
Antigüedad: 19 años, 6 meses
Puntos: 3
Formatear lector xml con php

Hola gente.

tengo un pequeño problema.

dejo en claro desde el principio que soy diseñador y mis nociones de programación snn mas bien básicas.

el siguiente código me ayuda a darle "lectura" a algunos archivos que tengo en formato xml.

Código:
//obtencion de noticias:
//Secciones:
$secciones = Array();
$secciones[0] = "http://www.sitio.com/noticias/espanol/periodico/ciencia-tecnologia/";
$secciones[1] = "http://www.sitio.com/noticias/espanol/periodico/deportes/";
$secciones[2] = "http://www.sitio.com/noticias/espanol/periodico/gente/";

//para desplegar el nombre de cada noticia:
$nombreSeccion = Array();
$nombreSeccion[0] = "Tecnología";
$nombreSeccion[2] = "Deportes";
$nombreSeccion[4] = "Gente";

//Array para guardar los titulos:
$titulos = Array();
//Array para guardar los thumbnails:
$thumbs = Array();
//Array para guardar los paths:
$paths = Array();
$print=false;
$tituloOK = false;
$thumbOK = true;
//contadores global:
$contGeneral = 0;
$contGeneralPaths = 0;
$contGeneralThumbs = 0;

//obtiene las 2 primeras noticias de cada secccion, en el orden en que aparecen arriba:

foreach($secciones as $seccion => $value)
{
	//abre el index.xml y obtiene las rutas de los archivos XML de cada noticia:
	//echo "<hr>abre ".$value."...<br>";
	$cont=0;
	$contPaths=0;
	//auxiliar indice actual de Seccion:
	$seccionActualIndex++;
	$tituloOK = false;	
	$parser=xml_parser_create();	
	xml_set_element_handler($parser,"start","stop");	
	//Specify data handler
	xml_set_character_data_handler($parser,"char");	
	//Open XML file
	$fp=fopen($value."index.xml","r");	
	//Read data
	while ($data=fread($fp,4096))
	  {
		  xml_parse($parser,$data,feof($fp)) or die (sprintf("XML Error: %s at line %d", 
		  xml_error_string(xml_get_error_code($parser)),
		  xml_get_current_line_number($parser)));
	  }	  
	//Free the XML parser
	xml_parser_free($parser);
	
}


//Function to use at the start of an element
function start($parser,$element_name,$element_attrs)
{
	global $titulos, $path, $thumb, $cont, $section, $print, $tituloOK, $paths, $contGeneralPaths, $contPaths, $secciones, $seccionActualIndex, $thumbOK;
	switch($element_name)
	{
		case "HEADLINE": //titulos:
			$tituloOK = true;
			$section = "titulo";
			break; 
		case "NEWSITEMREF"://path del XML de detalle:			
			foreach ($element_attrs as $key => $value) 
			{
			   if (strpos($value,"xml") != false && $contPaths<=1)
			   {
			   		$thumbOK = true;
					$paths[$contGeneralPaths]= $secciones[$seccionActualIndex-1].$value;
					$contGeneralPaths++;
					$contPaths++;
					//obtiene la ruta del thumnail del XML de detalle:
					$parser2=xml_parser_create();	
					xml_set_element_handler($parser2,"start2","stop");	
					//Specify data handler
					xml_set_character_data_handler($parser2,"char2");	
					//Open XML file
					
					//$fp=fopen($secciones[$seccionActualIndex-1].$value,"r");
					$fp=fopen($secciones[$seccionActualIndex-1].$value,"r");	
					//Read data
					while ($data=fread($fp,4096))
					  {
						  xml_parse($parser2,$data,feof($fp)) or die (sprintf("***XML Error: %s at line %d", 
						  xml_error_string(xml_get_error_code($parser2)),
						  xml_get_current_line_number($parser2)));
					  }	  
					  
					//Free the XML parser
					xml_parser_free($parser2);
					//<---	
			   }
			}
			break;
	}

}  
//Function to use when finding character data
function char($parser,$data)
{
	global $titulos, $path, $thumb, $cont, $print, $section, $tituloOK, $contGeneral;
	$la = $section;
	switch($section)
	{
		case "titulo":
			if ($tituloOK && $cont<=1)
			{
				//echo "<hr>".$data."<hr>";
				$titulos[$contGeneral] = $data;
				$tituloOK = false;
				$contGeneral++;
				$cont++;
			}
			break;
		case "contenido":
			$contenido = $contenido.$data;
			break;			
	}
}
function char2($parser,$data)
{
	
}
function start2($parser,$element_name,$element_attrs)
{
	global $thumbs, $contGeneralThumbs, $seccionActualIndex,$secciones, $thumbOK;;
	switch($element_name)
	{
		case "CONTENTITEM":		
		foreach ($element_attrs as $key => $value) 
		{
		   if (strpos($value,"thumbnail") != false && $thumbOK==true)
		   {
				$thumbs[$contGeneralThumbs]=$secciones[$seccionActualIndex-1].$value;
				$contGeneralThumbs++;
				$thumbOK=false;
		   }
	    }
   		break;
	}
}
//Function to use at the end of an element
function stop($parser,$element_name)
  {
	//echo "<hr />";
  }
//fin obtencion de noticias
al final despliego las noticias con el siguiente código.

Código:
<?
//despliega noticias:

$contDisplay=0;
foreach($titulos as $titulo => $value)
{
 if ($contDisplay==0 || $contDisplay==2 || $contDisplay==4)
 {
	echo "<div class='TitularSeccionNoticias'>".$nombreSeccion[$contDisplay].":</div>";
 }
?>
<div class="noticia">
	<a href="noticias/?f=<?=$paths[$contDisplay]?>" ><img src="<?=$thumbs[$contDisplay]?>" alt="Cablemas.com" longdesc="Tecnologia"/></a>
	<p><?=$value?>...<p>
	<div class="CreditoAFP">AFP</div>
</div>

<?
	$contDisplay++;
}
?>
lo cual funciona perfectamente, sin embargo por cuestiones de maquetación necesito agrupar las noticias de cada sección: Tecnología, Deportes y Gente dentro de un div cada una.

he intentado abrir un div antes de mostrar el titulo pero no se donde cerrarlo.

agradezco de antemano su paciencia ante tanto código.

disculepen si duplique la pregunta pero en la anterior estaba mal formulado.

saludos.
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 14:32.