Hola amigos de elhacker.net necesito una ayuda para lograr hacer mi analizador lexico de xml en php, lo que llevo es, cargo la tabla de simbolos a mi base de datos y luego tengo que leer el archivo xml, lo que quiero hacer es, leer linea por linea el xml y que cuando encuentre "<" sume caracter por caracter hasta encontrar ">" y guardalo en una variable e ir a comparar contra mi base de datos, pero no se que funciones usar para hacer lo que tengo pensado y no se asi esta bien o hay una manera mas facil.
esto es lo que llevo del archivo donde quiero leer el xml como un txt.
<?php
echo "Se ha Cargado el Archivo Exitosamente<br><br>";
$tope='>';
$archivo=fopen('archivos/ejemplo.xml','r')
or die("Problemas al abrir el archivo");
while(!feof($archivo))
{
$letra=fgets($archivo);
$saltos=n12br($letra);
echo $saltos;
$palabra=$palabra+$letra;
}
fclose($archivo);
?>
Muchas Gracias de antemano
________________
Grandeza no es solo saber, Grandeza tambien es ayudar y compartir!!!
usa strpos para buscar el"<"
http://www.php.net/manual/es/function.strpos.php (http://www.php.net/manual/es/function.strpos.php)
algo asi
$inicio = strpos("<", $letra);
$fin = strpos(">", $letra, $inicio);//para que empiece a buscar en donde consiguió el primer "<"
ahí inicio tiene el numero de caracter donde está "<" y fin el de ">"
Cita de: engelx en 4 Junio 2012, 21:42 PM
usa strpos para buscar el"<"
http://www.php.net/manual/es/function.strpos.php (http://www.php.net/manual/es/function.strpos.php)
algo asi
$inicio = strpos("<", $letra);
$fin = strpos(">", $letra, $inicio);//para que empiece a buscar en donde consiguió el primer "<"
ahí inicio tiene el numero de caracter donde está "<" y fin el de ">"
soy nuevo en php :-( y no se como hacer eso que me dices :o :S disculpa tanta molestia...
XD es simple XD
<?php
echo "Se ha Cargado el Archivo Exitosamente<br><br>";
$tope='>';
$archivo=fopen('archivos/ejemplo.xml','r')
or die("Problemas al abrir el archivo");
while(!feof($archivo))
{
$letra=fgets($archivo);// aquí se supone que está guardada una etiqueta
$inicio = strpos("<", $letra);
$fin = strpos(">", $letra, $inicio);
$etiqueta = substr($letra, $inicio, $fin-$inicio);
$saltos=n12br($letra);
echo $saltos;
$palabra=$palabra+$letra;
}
fclose($archivo);
?>
ahí $etiqueta contiene a lo que hay entre < y >, y substr aqui su uso
http://php.net/manual/es/function.substr.php (http://"substr")
Cita de: engelx en 4 Junio 2012, 22:17 PM
XD es simple XD
<?php
echo "Se ha Cargado el Archivo Exitosamente<br><br>";
$tope='>';
$archivo=fopen('archivos/ejemplo.xml','r')
or die("Problemas al abrir el archivo");
while(!feof($archivo))
{
$letra=fgets($archivo);// aquí se supone que está guardada una etiqueta
$inicio = strpos("<", $letra);
$fin = strpos(">", $letra, $inicio);
$etiqueta = substr($letra, $inicio, $fin-$inicio);
$saltos=n12br($letra);
echo $saltos;
$palabra=$palabra+$letra;
}
fclose($archivo);
?>
ahí $etiqueta contiene a lo que hay entre < y >, y substr aqui su uso
http://php.net/manual/es/function.substr.php (http://"substr")
No me muestra las etiquetas, y mire las funcion substr pero no se si esa solo funciones metiendo de una vez las posiciones y lo que quiero es que lea char, es decir cuando encuentre < empiece a "concatenar" las letras hasta que encuentre >, pero como ¿? :huh:
Cita de: GuateGio en 4 Junio 2012, 23:32 PM
No me muestra las etiquetas, y mire las funcion substr pero no se si esa solo funciones metiendo de una vez las posiciones y lo que quiero es que lea char, es decir cuando encuentre < empiece a "concatenar" las letras hasta que encuentre >, pero como ¿? :huh:
Mira estoy probando con este codigo:
<?php
echo "Se ha Cargado el Archivo Exitosamente<br><br>";
$archivo=fopen('archivos/ejemplo.xml','r')
or die("Problemas al abrir el archivo");
while(!feof($archivo))
{
$letra=fgets($archivo);
$inicio="<";
$fin=">";
$etiqueta=stream_get_line($letra, $inicio, $fin);
$saltos=nl2br($letra);
echo $saltos;
echo $etiqueta;
}
fclose($archivo);
?>
pero me da este error:
Warning: stream_get_line() expects parameter 1 to be resource, string given in C:\xampplite\htdocs\Archivos\parsearxml.php on line 25
Warning: stream_get_line() expects parameter 1 to be resource, string given in C:\xampplite\htdocs\Archivos\parsearxml.php on line 25
David Herrera
Warning: stream_get_line() expects parameter 1 to be resource, string given in C:\xampplite\htdocs\Archivos\parsearxml.php on line 25
452368
Warning: stream_get_line() expects parameter 1 to be resource, string given in C:\xampplite\htdocs\Archivos\parsearxml.php on line 25
el xml de ejemplo que estoy usando es este:
<contacto>
<nombre>David Herrera</nombre>
<telefono>452368</telefono>
</contato>
Gracias por ayudarme ;D
ups sorry XD la función strpos la puse al revez XD primero el la cadena, luego lo que se va a buscar XD
$inicio = strpos($letra, "<")+1;// le agrego +1 para quitar el primer <
$fin = strpos($letra,">", $inicio);
$etiqueta = substr($letra, $inicio, $fin-$inicio);
el substr lo que hace es tomar un texto, desde la posición indicada, con un largo indicado (por eso resto las posiciones)
atream_get_line no funciona igual que substr XD
stream_get_line funciona casi igual a fgets, por pequeñas diferencias :P
http://www.php.net/manual/es/function.stream-get-line.php (http://www.php.net/manual/es/function.stream-get-line.php)
Cita de: engelx en 4 Junio 2012, 23:56 PM
ups sorry XD la función strpos la puse al revez XD primero el la cadena, luego lo que se va a buscar XD
$inicio = strpos($letra, "<")+1;// le agrego +1 para quitar el primer <
$fin = strpos($letra,">", $inicio);
$etiqueta = substr($letra, $inicio, $fin-$inicio);
el substr lo que hace es tomar un texto, desde la posición indicada, con un largo indicado (por eso resto las posiciones)
Si estaba al reves la funcion :P ya corregi el codigo quedo asi:
<?php
echo "Se ha Cargado el Archivo Exitosamente<br><br>";
$archivo=fopen('archivos/ejemplo.xml','r')
or die("Problemas al abrir el archivo");
while(!feof($archivo))
{
$letra=fgets($archivo);// aquí se supone que está guardada una etiqueta
$inicio = strpos($letra, "<")+1;// le agrego +1 para quitar el primer <
$fin = strpos($letra,">", $inicio);
$etiqueta = substr($letra, $inicio, $fin-$inicio);
$saltos=n12br($letra);
echo $saltos;
echo $etiqueta;
}
fclose($archivo);
?>
y me muestra asi:
contactoDavid Herrera
nombre452368
telefono/contato
como hacer para que me muestre asi:
<contacto>
<nombre>
David Herrera
</nombre>
<telefono>
452368
</telefono>
</contato>
porque despues de eso agarrare cada una de las plabras y las ire a comparar con la tabla de simbolos:
mi tabla de simbolos es esta:
[b]Variables Tipo Expresion [/b]
<contacto> PR
<nombre> PR
</nombre> PR
nombre ID /^[A-Z][a-z]*s[A-Z][a-z]*$/
<telefono> PR
</telefono> PR
telefono ID /^(2|3)[0-9]{7}$/
</contacto> PR
como ves en mi tabla de simbolos si comparo la etiqueta nombre sin los < > me mostrara error o lo tomara como un ID
Muchas gracias por tomarte el tiempo de ayudarme.... ;-) :rolleyes:
si no te importan los saltos de linea extras puedes hacer un str_replace
http://www.php.net/manual/es/function.substr-replace.php (http://www.php.net/manual/es/function.substr-replace.php)
$letra = str_replace(">",">\n",$letra);
esto va a colocar un salto de linea luego de cada ">"
(en caso de dudas \n significa salto de linea)
Cita de: engelx en 5 Junio 2012, 01:47 AM
si no te importan los saltos de linea extras puedes hacer un str_replace
http://www.php.net/manual/es/function.substr-replace.php (http://www.php.net/manual/es/function.substr-replace.php)
$letra = str_replace(">",">\n",$letra);
esto va a colocar un salto de linea luego de cada ">"
(en caso de dudas \n significa salto de linea)
mira hice ese cambio que me enviaste pero yo en lugar de colocar
$letra = str_replace(">",">\n",$letra);
coloque
$saltos = str_replace("<","<\n",$letra)."<br>";
y me dio este resultado
Se ha Cargado el Archivo Exitosamente
< contacto>
< nombre>David Herrera< /nombre>
< telefono>187895< /telefono>
< /contato>
tambien en esta parte
$inicio = strpos($letra,"<")+1;// le agrego +1 para quitar el primer <
le quite el +1 porque me daba este error
Warning: strpos() [function.strpos]: Offset not contained in string in C:\xampplite\htdocs\Archivos\parsearxml.php on line 24
y entonces el codigo lo tengo asi pero si te da cuenta en el resultado me agrega las etiquetas con un espacio luego del simbolo < es decir quedan asi < nombre>
<?php
echo "Se ha Cargado el Archivo Exitosamente<br><br>";
$archivo=fopen('archivos/ejemplo.xml','r')
or die("Problemas al abrir el archivo");
while(!feof($archivo))
{
$letra=fgets($archivo);// aquí se supone que está guardada una etiqueta
$inicio = strpos($letra,"<");// le agrego +1 para quitar el primer <
$fin = strpos($letra,">", $inicio);
$etiqueta = substr($letra, $inicio, $fin-$inicio);
$saltos = str_replace("<","<\n",$letra)."<br>";
echo $saltos;
}
fclose($archivo);
?>
siempre muy agradecido ;D hermano ;-)
XD creoq ue me di mal a entender XD
te decia solo usar el str_replace XD
<?php
echo "Se ha Cargado el Archivo Exitosamente<br><br>";
$archivo=fopen('archivos/ejemplo.xml','r')
or die("Problemas al abrir el archivo");
while(!feof($archivo))
{
$letra=fgets($archivo);// aquí se supone que está guardada una etiqueta
$saltos = str_replace("<","<\n",$letra)."<br>";
echo $saltos;
}
fclose($archivo);
?>
Cita de: engelx en 5 Junio 2012, 07:12 AM
XD creoq ue me di mal a entender XD
te decia solo usar el str_replace XD
<?php
echo "Se ha Cargado el Archivo Exitosamente<br><br>";
$archivo=fopen('archivos/ejemplo.xml','r')
or die("Problemas al abrir el archivo");
while(!feof($archivo))
{
$letra=fgets($archivo);// aquí se supone que está guardada una etiqueta
$saltos = str_replace("<","<\n",$letra)."<br>";
echo $saltos;
}
fclose($archivo);
?>
:P no habia entendido que era para simplificar jajaja, pero siempre me queda un espacio luego del < a que se debe esto?
Cita de: GuateGio en 5 Junio 2012, 07:31 AM
:P no habia entendido que era para simplificar jajaja, pero siempre me queda un espacio luego del < a que se debe esto?
ahora tengo otra duda como hago para comparar palabra por palabra con mi tabla que esta en mi base de datos :huh: disculpa tanta molestia... :rolleyes:
No entiendo para que queres hacer esto, si queres parsear XML te recomiendo que uses SimpleXML (http://www.php.net/manual/es/ref.simplexml.php). Un ejemplo:
<?php
$xml = simplexml_load_file('ejemplo.xml');
printf("Nombre: %s<br/>Telefono: %s", $xml->nombre, $xml->telefono);
?>
Saludos
Cita de: El As del Club Paris en 5 Junio 2012, 15:18 PM
No entiendo para que queres hacer esto, si queres parsear XML te recomiendo que uses SimpleXML (http://www.php.net/manual/es/ref.simplexml.php). Un ejemplo:
<?php
$xml = simplexml_load_file('ejemplo.xml');
printf("Nombre: %s<br/>Telefono: %s", $xml->nombre, $xml->telefono);
?>
Saludos
Primeramente muchas gracias por responder, y lo que quiero hacer es agarrar palabra por palabra y compararlas con una tabla que tengo en una base de datos, soy nuevo en php y no se si con
SimpleXML (http://www.php.net/manual/es/ref.simplexml.php) puedo hacer esto... :huh:
nuevamente gracias....
SimpleXML sirve para cargar un archivo XML en un objeto, y acceder a sus miembros como si de un array se tratase.
Por ejemplo en el codigo anterior:
$xml = simplexml_load_file('ejemplo.xml');
Lo que hace eso es cargar el archivo ejemplo.xml en la variable $xml (poder usar el nombre que vos quieras...)
Luego para mostrar el nombre haces:
echo $xml->nombre;
Te aconsejaria leer un poco mas sobre PHP, buscate algun manual de introduccion, y luego si largate a hacer estas cosas ;)
Saludos
Cita de: El As del Club Paris en 5 Junio 2012, 16:07 PM
SimpleXML sirve para cargar un archivo XML en un objeto, y acceder a sus miembros como si de un array se tratase.
Por ejemplo en el codigo anterior:
$xml = simplexml_load_file('ejemplo.xml');
Lo que hace eso es cargar el archivo ejemplo.xml en la variable $xml (poder usar el nombre que vos quieras...)
Luego para mostrar el nombre haces:
echo $xml->nombre;
gracias por el consejo y una duda mas... el simplexml me funciona aunque yo no sepa que etiquetas tiene el archivo xml???
Te aconsejaria leer un poco mas sobre PHP, buscate algun manual de introduccion, y luego si largate a hacer estas cosas ;)
Saludos