Dado que ya he hecho un post acerca de como realizar peticiones cURL y otro relacionado con el formateo de XML, sólo me falta lo evidente, un post acerca de como leer y trabajar con los datos XML recibidos. Desde que tenemos la versión 5 del PHP disponemos de la extensión SimpleXML la cual nos proporciona una forma muy rápida y fácil de leer datos XML. Si has programado parsers XML usando librerías como expat encontrarás que esta extensión es una auténtica maravilla, aunque como siempre, a costa de consumir más recursos (básicamente más memoria... pero lo vale).
Con SimpleXML consigues muy fácilmente convertir un archivo XML en un objeto. Para representar la estructura de elementos del documento XML se construye un objeto con atributos q pueden contener directamente valores o arrays de objetos q también tendrán más atributos, más arrays de objetos, etc. (el número de arrays de arrays de objetos depende de los niveles de anidación de los elementos). Se puede trabajar con estos objetos como con cualquier otro en PHP.
Se entiende mucho mejor su uso con un ejemplo sencillo. Imaginemos el siguiente documento XML:
-
<?xml version='1.0'?>
-
<mensajes>
-
<mensaje>
-
<asunto>Hola</asunto>
-
<texto>Hola, que tal?</texto>
-
</mensaje>
-
<mensaje>
-
<asunto>Re: Hola</asunto>
-
<texto>Bien, gracias.</texto>
-
</mensaje>
-
</mensajes>
Asumiendo que en $data tenemos el XML a leer con un código PHP como:
-
$xml = simplexml_load_string($data);
-
foreach ($xml->mensaje as $mensaje)
Obtendremos el resultado:
Hola, que tal? Bien, gracias.
SimpleXML nos puede devolver errores de todo tipo, documentos malformados, problemas de encodings, etc. Si estás en un entorno donde sólo te interesan los documentos válidos y quieres descartar el resto resulta útil algo como:
-
function loadXML($data) {
-
$xml = @simplexml_load_string($data);
-
throw new Exception('Error en la lectura del XML',1001);
-
return $xml;
-
}
Si queremos volver a obtener el documento XML dado un objeto SimpleXML es tan fácil como:
En ocasiones tenemos XML con muchos niveles de elementos y se hace especialmente engorroso ir recorriendo con "foreach" todo el documento. En estas situaciones, como en muchas otras, es necesario poder buscar dentro de los XML. Esto lo conseguimos con el soporte XPath que ofrece SimpleXML. Por ejemplo para acceder a todos los elementos "asunto" del ejemplo anterior:
-
foreach ($xml->xpath('//asunto') as $asunto)
Existen dos consideraciones a tener en cuenta con el uso de SimpleXML:
1) Si quieres acceder a un elemento que tiene un guión "-" en su nombre debes hacerlo así:
-
foreach ($xml->{'mensaje-personal'} as $mensaje)
Si suponemos que en el ejemplo anterior sustituimos "mensaje" por "mensaje-personal".
2) Es recomendable hacer cast a string siempre que obtenemos datos de los objetos SimpleXML. En ocasiones (unexpected :) en lugar de devolver directamente el valor de un elemento devuelve otro objeto SimpleXML, se soluciona con:
-
$texto = (string) $data_o->mensaje[0]->texto;
Antes de terminar comento otra característica interesante y es que podemos convertir un objeto SimpleXML en un objeto DOM y viceversa usando las funciones simplexml_import_dom() y dom_import_simplexml(), incluso en las últimas versiones del PHP se le han añadido métodos para poder modificar y crear desde cero documentos XML trabajando directamente con el objeto SimpleXML (al estilo DOM).
Etiquetas en Technorati: artículos, php, programación, simplexml, webmaster, xml, xpathEntradas Relacionadas:


estoy haciendo un guestbook que guarda los registros en un archivo xml, mismo que es manipulado (leído y escrito) por un script php. Cuando es leido, devuelve el contenido en html para ser desplegado tal cual en la página a través de una petición XMLHttpRequest. Todo funciona bien, guarda y devuelve y despliega los mensajes perfectamente. El xml es como el siguiente:
nick/nombre–1
web/mail–1
mensaje–1
nick/nombre–2
web/mail–2
mensaje–2
nick/nombre–3
web/mail–3
mensaje–3
No soy muy avanzado en php ni en xml, y mi problema (ojalá me puedan ayudar) es que no sé cómo hacer que los mensajes nuevos aparezcan primero, ya que en el xml los nuevos registros van quedando hasta abajo, antes de , o que php al momento de leerlos que los muestre en el orden contrario en el que se encuentran, esto es, primero los nuevos (los de abajo). Estoy usando las funciones simplexml de php5 para leer y ecribir el xml. No sé, tal vez es algo muy simple y yo me estoy rompiendo la cabeza de más, pero bueno, para saberlo vine aquí. Saludos.
no acabo de entender como lo tienes montado pero… así a bote pronto:
- si escribes tu los datos en el XML usando simplexml puedes insertar los nuevos al principio.
- otra opción es leer los nick del último al primero ya sea desde javascript o desde PHP antes de enviarlo (si es q no lo envías directo). Desde PHP puedes usar algo como array_reverse() o con un simple “for” desde el fin al principio en lugar de “foreach”.
hola
tengo creado un formulario que se llama agenda, con nombre, direccion, telefono, Email y obervaciones,genero un archivo en php que los guarda. me gustaria saber como se puede generar un xml porque en relidad estoy confundido que hace un xml
FORMULARIO:
Encuesta Nº 1
Nombre:
Direccion
Comuna
Telefono
Tel. Celular
Email
Empresa
Direccion Empresa
Tel. Empresa
Cargo
Observaciones:
ARCHIVO QUE LO GUARDA:
TE QUEDARIA MUY AGRADEIDO YA QUE CON ESTO QUEDARIA MAS CLARO GRACIAS
Si la duda es que es un XML: http://es.wikipedia.org/wiki/XML
XML es un metalenguaje extensible de etiquetas desarrollado por el W3C que se propone como un estándar para el intercambio de información estructurada entre diferentes plataformas.
Un ejemplo de uso del XML en la situación que entiendo que tienes sería:
Un script PHP que genera un formulario HTML y a la vez es el encargado de recoger los datos por GET/POST y guardarlos (es el action del form)… pero la pregunta es ¿donde quieres guardar los datos?. Lo que podrías hacer es que el script PHP generase un XML con los datos recibidos:
<encuesta><nombre></nombre>
<!-- ... -->
</encuesta>
Y después leerlos con SimpleXML como explico en el post :)
alguien que sepa de un hosting php5 gratis para probar mi buscador de videos youtube que lo eh echo con simplexml , pues los host que dicen ser php5 qu eh encontrado no me agarran simplexml … ya ehh probado mi buscador en localhost y funcina bien solo deseo uno host de prueba para probar el buscar ya despues me voy a pagar un host solo quiero de prueba no importa con anuncios si alguien sabe , si puede me manda al correo [email protected]
hola
Estoy haciendo un repositorio de objetos de aprendizaje, los objetos de aprendizaje son empaquetados en un zip bajo el estandar SCORM, estos objetos de aprendizaje contienen metadatos con la descripcion del objeto. lo que quiero hacer es leer los metadatos del archivo xml del objeto mediante php y almacenar los metadatos en una base de datos de sql, para poder catalogar los objetos realizar busquedas etc
Aunque no he trabajado con SCORM desde PHP por lo que sé no deberías tener problemas con el uso de SimpleXML para leer los datos de los archivos XML contenidos en un paquete. Si es que ya lo has probado ¿Dónde está el problema?
Buenas tardes, tengo que recuperar unos datos sobre libros que estan en xml y me he estado mirando sax, simplexml etc… de momento con lo que mas he conseguido algo ha sido con simplexml, el problema es que mis etiquetas tienen atributos, o sea: en lugar de
algo
queda asi
algo
y no hay manera de que me muestre las etiquetas si tienen atributos…
muchas gracias y muy bueno el tutorial :)
perdón por el retraso :)
con el filtro de WordPress no puedo ver bien tu código y no sé exactamente donde está el problema.
En todo caso con SimpleXML puedes acceder a los elementos tengan o no atributos de la misma forma y puedes acceder a los atributos de un elemento en concreto como si fuera un array. Otra opción es usar una expresión XPath para directamente obtener los elementos con un atributo (o valor de atributo) determinado.
Hola!
Estoy intentando leer un xml desde un formulario con SimpleXML pero me tira warnings…
Detallo como esta en codigo y el ejemplo para ver si me pueden ayudar:
En el formulario en el item xml ingreso el siguiente ejemplo:
facundo
005491144345601
005491145104302
Contenido del mensaje de texto
En el codigo:
$xml = $_REQUEST[’data’];
$xmlElement = simplexml_load_string($xml);
Como resultado me tira lo siguiente:
Warning: simplexml_load_string() [function.simplexml-load-string]: Entity: line 1: parser error : String not started expecting ‘ or " in /home/p4r4com/public_html/analia/push/sms.service.php on line 78
Warning: simplexml_load_string() [function.simplexml-load-string]: <?xml version=\’1.0\’ encoding=\’UTF-8\’?> in /home/p4r4com/public_html/analia/push/sms.service.php on line 78
Warning: simplexml_load_string() [function.simplexml-load-string]: ^ in /home/p4r4com/public_html/analia/push/sms.service.php on line 78
Warning: simplexml_load_string() [function.simplexml-load-string]: Entity: line 1: parser error : Malformed declaration expecting version in /home/p4r4com/public_html/analia/push/sms.service.php on line 78
Warning: simplexml_load_string() [function.simplexml-load-string]: <?xml version=\’1.0\’ encoding=\’UTF-8\’?> in /home/p4r4com/public_html/analia/push/sms.service.php on line 78
Warning: simplexml_load_string() [function.simplexml-load-string]: ^ in /home/p4r4com/public_html/analia/push/sms.service.php on line 78
Warning: simplexml_load_string() [function.simplexml-load-string]: Entity: line 1: parser error : Blank needed here in /home/p4r4com/public_html/analia/push/sms.service.php on line 78
Warning: simplexml_load_string() [function.simplexml-load-string]: <?xml version=\’1.0\’ encoding=\’UTF-8\’?> in /home/p4r4com/public_html/analia/push/sms.service.php on line 78
Warning: simplexml_load_string() [function.simplexml-load-string]: ^ in /home/p4r4com/public_html/analia/push/sms.service.php on line 78
Warning: simplexml_load_string() [function.simplexml-load-string]: Entity: line 1: parser error : parsing XML declaration: ‘?>’ expected in /home/p4r4com/public_html/analia/push/sms.service.php on line 78
Warning: simplexml_load_string() [function.simplexml-load-string]: <?xml version=\’1.0\’ encoding=\’UTF-8\’?> in /home/p4r4com/public_html/analia/push/sms.service.php on line 78
Warning: simplexml_load_string() [function.simplexml-load-string]: ^ in /home/p4r4com/public_html/analia/push/sms.service.php on line 78
Warning: simplexml_load_string() [function.simplexml-load-string]: Entity: line 2: parser error : AttValue: " or ‘ expected in /home/p4r4com/public_html/analia/push/sms.service.php on line 78
Warning: simplexml_load_string() [function.simplexml-load-string]: <service type=\’sms\’> in /home/p4r4com/public_html/analia/push/sms.service.php on line 78
Warning: simplexml_load_string() [function.simplexml-load-string]: ^ in /home/p4r4com/public_html/analia/push/sms.service.php on line 78
Warning: simplexml_load_string() [function.simplexml-load-string]: Entity: line 2: parser error : attributes construct error in /home/p4r4com/public_html/analia/push/sms.service.php on line 78
Warning: simplexml_load_string() [function.simplexml-load-string]: <service type=\’sms\’> in /home/p4r4com/public_html/analia/push/sms.service.php on line 78
Warning: simplexml_load_string() [function.simplexml-load-string]: ^ in /home/p4r4com/public_html/analia/push/sms.service.php on line 78
Warning: simplexml_load_string() [function.simplexml-load-string]: Entity: line 2: parser error : Couldn’t find end of Start Tag service line 2 in /home/p4r4com/public_html/analia/push/sms.service.php on line 78
Warning: simplexml_load_string() [function.simplexml-load-string]: <service type=\’sms\’> in /home/p4r4com/public_html/analia/push/sms.service.php on line 78
Warning: simplexml_load_string() [function.simplexml-load-string]: ^ in /home/p4r4com/public_html/analia/push/sms.service.php on line 78
Warning: simplexml_load_string() [function.simplexml-load-string]: Entity: line 2: parser error : Extra content at the end of the document in /home/p4r4com/public_html/analia/push/sms.service.php on line 78
Warning: simplexml_load_string() [function.simplexml-load-string]: <service type=\’sms\’> in /home/p4r4com/public_html/analia/push/sms.service.php on line 78
Warning: simplexml_load_string() [function.simplexml-load-string]: ^ in /home/p4r4com/public_html/analia/push/sms.service.php on line 78
Donde justamente la linea 78 es: $xmlElement = simplexml_load_string($xml);
Me faltara llamar al constructor? El xml lo veo bien formado, sinceramente necesito solucionar el tema urgente! Si alguno me puede orientar se lo agradecere!
Perdon… pero veo que no sale correctamente mi xml… como puedo escribirlo para que lo vean correctamente? Muchas gracias
Hola Etej,
Para escribir XML en los comentarios y que aparezca correctamente es un poco coñazo. Lo has de poner todo entre tags <code> y sustituir los < por < y los > por > en tu XML. En los posts tengo un plugin que me lo hace mucho más fácil pero no sirve para los comentarios.
Hola que tal?
Necesito de sus grandísimas ayudas…
Lo que pasa es que estoy haciendo un programa en php5 que lea un archivo xml, y me inserte, consulte, elimine y modifique nodos xml.
Por ejemplo:
Tengo este archivo:
Ana
111
aaa
Luis
222
bbb
Juan
333
ccc
Hasta el momento, despues de tanto investigar puedo hacer correctamente sólo insertar y consultar nodos.
Y sólo de esto he encontrado información.
Lo malo está en que no puedo modificar ni eliminar, porque no se cómo hacerle, no he encontrado información sobre esto.
Quisiera eliminar todo un cliente, por ejemplo, eliminar a Luis, y que me quedara así
Ana
111
aaa
Juan
333
ccc
O bién modificar todos los datos de Luis y cambiarle hasta el nombre, por decir que en lugar de los datos de luis quedaran otros como: nombre = Carlos, telefono = 444 y domicilio = ddd, y quedara así:
Ana
111
aaa
Carlos
444
ddd
Juan
333
ccc
Espero y me ayuden porfavor, es urgentísimo.
Ayudenme, no importa si tengo que usar Dom ó SimpleXML, Como sea, pero ayudenme, porfavor.
Gracias de antemano.
Hola que tal,
Estoy atorado con XML y PHP, tengo un un xml que tomo de un sitio web que alberga videos, y necesito leerlo con PHP, lo hago de la siguiente manera:
$data = file_get_contents($url,FALSE,NULL); //
$fileData = new SimpleXMLElement($data);
el XML que me genera es el siguiete:
Query Result
http://
Result of query
HelpSample.mov
Fri, 07 Mar 2008 19:28:38
616043
Ser
0XCzIG2UEp5kcbiEJW0yIWom13
etc…
etc…
puedo leer perfectamente la info dentro de ,, pero no los que estan en ó en pocas palabras no se como leer las etiquetas con “:” alguien sabe como hacerlo se que debe de ser una tonteria pero no tengo experiencia con XML y php.
Gracias!