Un bloc de notas

octubre 4, 2006

Procesamiento de datos en XML desde PHP

Filed under: Código Fuente,Lenguaje PHP,Programación — Chema @ 9:22 am

Este código genera código HTML para añadir a un formulario, a partir de un fichero XML y otro de estilos. El fichero podría llamarse funcprocdatos.php:

  Código:
 

<?

// Variables globales
$nomFich=”datos.xml”;
$etiquetas=Array(“NADA”,”DATOS”,”DATO”,”NOMBRE”,”DESCRIPCION”,”LISTA”,”ELEMENTO”); // Etiquetas válidas
$tipo=”NADA”;
$contLin=0;
$hayEstilos=false;
$estilo1=””;
$estilo2=””;// Tratamiento de los atributos

function AtributosOpcion($atributos) {

global $hayEstilos;
global $estilo1;
global $estilo2;
foreach ($atributos as $nom => $val) {

switch (strtoupper($nom)) {
case “LSTNOM”:

echo ‘ name=”‘.$val.'”‘;
break;

case “ELTXT”:

echo $val;
break;

case “ELVALOR”:

echo ‘ value=”‘.$val.'”>’;
break;

case “ANCHO”:

echo ‘ width=”‘.$val.'”‘;
break;

case “BORDE”:

echo ‘ border=”‘.$val.'”‘;
break;

case “ESTILOLINIMPAR”:

$hayEstilos=true;
$estilo1=$val;
break;

case “ESTILOLINPAR”:

$hayEstilos=true;
$estilo2=$val;
break;

case “ESTILO”:

echo ‘ class=”‘.$val.'”‘;
break;

default:

echo “Se ha encontrado un atributo no válido: $nom=$val”;

}

}

}

// Tratamiento de la etiqueta inicial

function ElementoInicio($parser, $nombre, $atribs) {

global $etiquetas;
global $tipo;
global $contLin;
global $hayEstilos;
global $estilo1;
global $estilo2;
$tipo=strtoupper($nombre);
$encontrado=false;
foreach ($etiquetas as $valor) {

if ($valor==$tipo) {

$encontrado=true;
break;

}

}
if (!encontrado) {

die(“Se ha encontrado una etiqueta no válida: $nombre”);

}
switch ($tipo) {

case ‘LISTA’:

echo “<td>”;
echo ‘<select’;
AtributosOpcion($atribs);
break;

case ‘ELEMENTO’:

echo “<option”;
AtributosOpcion($atribs);
break;

case ‘NADA’:

break;

case ‘DATOS’:

echo “<table”;
AtributosOpcion($atribs);
echo “>”;
break;

case ‘DATO’:

echo “<tr”;
if ($hayEstilos) {

$contLin++;
if ($contLin % 2 == 0) {

echo ‘ class=”‘.$estilo1.'”‘;

} else {

echo ‘ class=”‘.$estilo2.'”‘;

}

}
echo “>”;
break;

case ‘NOMBRE’:

echo “<td>”;
break;

case ‘ELEMENTO’:

break;

case ‘DESCRIPCION’:

echo “<td>”;
break;

default:

die(sprintf(“Error de etiqueta desconocida %s en la línea”, $tipo, xml_get_current_line_number($parser)));

}

}

// Tratamiento de la etiqueta final
function ElementoFin($parser, $nombre) {

global $tipo;
switch (strtoupper($nombre)) {

case ‘LISTA’:

echo “</select>”;
echo “</td>”;
break;

case ‘OPCION’:

break;

case ‘NADA’:

break;

case ‘DATOS’:

echo “</table>”;
break;

case ‘DATO’:

echo “</tr>”;
break;

case ‘NOMBRE’:

echo “</td>”;
break;

case ‘ELEMENTO’:

break;

case ‘DESCRIPCION’:

echo “</td>”;
break;

default:

die(sprintf(“Error de etiqueta desconocida %s en la línea”,
$tipo, xml_get_current_line_number($parser)));

}

}

// Tratamiento del texto que hay entre las etiquetas
function CaracteresDatos($parser, $dato) {
global $tipo;
if (trim($dato)!=”” && !is_null($dato)) {
switch ($tipo) {
case ‘LISTA’:

break;

case ‘OPCION’:

break;

case ‘NADA’:

break;

case ‘DATOS’:

break;

case ‘DATO’:

break;

case ‘NOMBRE’:

echo trim($dato);
break;

case ‘DESCRIPCION’:

echo trim($dato);
break;

case ‘ELEMENTO’:

break;

default:

die(sprintf(“Error de etiqueta desconocida %s en la línea”,
$tipo,
xml_get_current_line_number($parser)));

}
}
}function ProcesarXML() {
global $nomFich;
$xmlParser=xml_parser_create(“utf-8″);
xml_set_element_handler($xmlParser,”ElementoInicio”,”ElementoFin”);
xml_set_character_data_handler($xmlParser,”CaracteresDatos”);
if (!($fich=fopen($nomFich,”r”))) {
exit(“No se ha podido abrir el fichero de entrada”);
}while ($datos=fread($fich,4096)) {
if (!xml_parse($xmlParser,$datos,feof($fich))) {
die(sprintf(“XML error: %s en la línea %d”,
xml_error_string(xml_get_error_code($xmlParser)),
xml_get_current_line_number($xmlParser)));
}
}
fclose($fich);
}
?>

Ejemplo de uso:

  Código:
  <head>
<?
echo ‘<link href=”estilos.css” rel=”stylesheet” type=”text/css” />’;
include_once(“funcprocdatos.php”);
?>
</head><body>
<form id=”form1″ name=”form1″ method=”post” action=”listar.php”>
<?
ProcesarXML();
?>
<input type=”submit” name=”Submit” value=”Enviar” />
</form>
</body>

La hoja de estilos utilizada:

  Código:
 

.estL1 {

color: #FFFFFF;
background-color: #FF0000;
font-weight: bold;

}

.estL2 {

color: #000000;
background-color: #FFCC00;
font-weight: bold;

}

.estiloTabla {

width: 40%;
margin: 0px;

}

td {

padding: 5px;

}

El fichero XML utilizado:

dato.xml:

  Código:
 

<?xml version=”1.0″ encoding=”utf-8″?>
<datos estilo=”estiloTabla” estiloLinImpar=”estL1″ estiloLinPar=”estL2″>

<dato>

<nombre>El 1 nombre
</nombre>

<descripcion>La 1 descripción
</descripcion>

<lista lstNom=”list1″>

<elemento elValor=”1″ elTxt=”list1-1″/>
<elemento elValor=”2″ elTxt=”list1-2″/>
<elemento elValor=”3″ elTxt=”list1-3″/>

</lista>

</dato>

<dato>

<nombre>El 2 nombre
</nombre>

<descripcion>La 2 descripción
</descripcion>

<lista lstNom=”list2″>

<elemento elValor=”1″ elTxt=”list2-1″/>
<elemento elValor=”2″ elTxt=”list2-2″/>
<elemento elValor=”3″ elTxt=”list2-3″/>

</lista>

</dato>

</datos>

Dejar un comentario »

Aún no hay comentarios.

RSS feed for comments on this post. TrackBack URI

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

Crea un blog o un sitio web gratuitos con WordPress.com.

A %d blogueros les gusta esto: