Está en la página 1de 42

Qu es y para qu sirve el lenguaje de etiquetas XML (Extensible Markup Language)?

Escrito por Walter Sagstegui Lescano

Resumen:

Qu es el lenguaje XML?: Lenguaje de Marcado Extensible, que a diferencia del HTML separa el contenido de la presentacin, y se est convirtiendo en un estndar de amplio uso para el intercambio de datos.
Codificacin aprenderaprogramar.com: DV00202A

QU ES EL LENGUAJE XML? XML (Extensible Markup Language) es un lenguaje de etiquetas, es decir, cada paquete de informacin est delimitado por dos etiquetas como se hace tambin en el lenguaje HTML, pero XML separa el contenido de la presentacin. Explicaremos esto con el siguiente ejemplo: <H1>Mateo</H1> <Nombre>Mateo</Nombre> <--- HTML <--- XML

<H1> y <Nombre> son etiquetas. Ambas encierran el texto o paquete de informacin Mateo. La etiqueta <H1> es de HTML, y se encarga de mostrar visualmente el texto Mateo en la pgina web en un tamao determinado pero no dice nada del significado de Mateo: si es una c iudad o un nombre, por ejemplo. En cambio la etiqueta <Nombre> es de XML y nos dice que Mateo es un nombre de persona, por lo tanto XML se preocupa del significado del texto que encierra y no de la apariencia de cmo se muestre el texto en la pgina web. Por eso se dice que XML es un lenguaje de etiquetas, que como hemos dicho anteriormente, separa el contenido de la presentacin. Lo mismo se puede definir el lenguaje XML usando palabras mas tcnicas pero con el mismo significado que la definicin anterior: XML describe el sentido semntico de los datos dejando de lado la presentacin.

POR QU ES TIL EL LENGUAJE XML PARA LOS PROGRAMAS INFORMTICOS? Un programa informtico puede estar escrito en Java, Visual Basic y cualquier otro lenguaje. En esencia, todos los programas procesan informacin, entendindose por informacin dato + significado. Para el caso que estamos viendo, el dato en el ejemplo sera Mateo y el significado es un nombre de persona. Por lo tanto un documento escrito en XML tendra la informacin que necesitan los programas para procesar.

XML se plantea como un lenguaje estndar para el intercambio de informacin entre diferentes programas de una manera segura, fiable y libre, ya que no pertenece a ninguna compaa. Podemos ver por qu el XML es tan interesante para el intercambio de datos con el siguiente ejemplo:

Mateo naci el 15.10.2012 en la ciudad de Madrid con un peso de 3.1 kg y una estatura de 45 cm. Maribel naci el 11.09.1976 en la ciudad de Sevilla con un peso de 3 Kg y una estatura de 40 cm.
Analizando el texto, nos encontramos que hay datos como Madrid y su correspondiente significado, que es una ciudad y otros ms en un formato humano, tan slo entendible por personas, no por los programas. Por tanto, podemos convertir el texto tanto en una base de datos tradicional como en un archivo o documento XML, que son formatos que los programas ya podran entender, de la siguiente manera: En formato tabla (base de datos tradicional):

Nombre Mateo Maribel

Fecha 15.10.2012 11.09.1976

Ciudad Madrid Sevilla

Peso 3.1 3

Estatura 45 40

En formato XML: <Datos-Nacimiento> <Persona> <Nombre>Mateo</Nombre> <Fecha>15.10.2012</Fecha> <Ciudad>Madrid</Ciudad> <Peso>3.1Kg</Peso> <Estatura>45cm</Estatura> </Persona> <Persona> <Nombre>Maribel</Nombre> <Fecha>11.09.2012</Fecha> <Ciudad>Sevilla</Ciudad> <Peso>3Kg</Peso> <Estatura>40cm</Estatura> </Persona> </Datos-Nacimiento> Muchas instituciones pblicas ya estn utilizando XML para almacenar su informacin, siguiendo estos criterios de organizacin de datos. Esto es lo que llamamos una base de datos en XML. Otra posibilidad interesante del XML es que a partir de un documento en XML se pueden generar archivos PDF y en otros formatos. De esta forma, la informacin puede ser presentada de una manera visual para su lectura por las personas y el XML slo quedara para ser entendido por los programas; aunque si hacemos un esfuerzo, vemos que es fcil para una persona extraer la informacin de un documento XML directamente.

REGLAS BSICAS PARA ESCRIBIR CORRECTAMENTE UN DOCUMENTO XML - Una etiqueta de apertura siempre tiene su contraparte de cierre con /. Por ejemplo:

Incorrecto : <Nombre>Mateo Correcto : <Nombre>Mateo</Nombre>

- Slo puede haber un elemento raz, en el que estn contenidos todos los dems, con una estructura jerrquica.

- El acrnimo XML(o xml o xMl, etc.) no puede usarse como caracteres iniciales de un nombre de etiqueta o atributo.

- El XML es sensible al tipo de letra utilizado (case-sensitive), es decir, trata las maysculas y minsculas como caracteres diferentes. Por ejemplo, no es lo mismo <automvil> que <Automvil> - Una etiqueta vaca, es la que no tiene contenido, por lo que se cerrara al final en la misma etiqueta de apertura. Por ejemplo: <Persona nombre=walter/> <parmetro /> - Las etiquetas pueden tener atributos, que son una manera de incorporar caractersticas o propiedades a las etiquetas de un documento. El atributo consta de dos partes: La propiedad del elemento y el valor de la

propiedad, que siempre va entre comillas doble () o simple (). Por ejemplo: modelo y color serian atribut os de la etiqueta Vehiculo: <Vehiculo marca=Toyota modelo="45 TC" color="plomo">En venta</Vehiculo> - Una etiqueta con contenido, puede modelarse como una etiqueta vaca con atributos. Por ejemplo:

EJEMPLO A continuacin daremos un ejemplo de forma prctica, en donde crearemos un documento XML que contenga la descripcin de algunos partidos jugados por los equipos de ftbol de la liga espaola. Usando las caractersticas vlidas para un documento XML podemos escribir. <Liga> <Partido nmero="1"> <Local>Barcelona</Local> <Visita>Real Madrid</Visita> <Goles-Local>2</Goles-Local> <Goles-Visita>3</Goles-Visita> </Partido> <Partido nmero="2"> <Local>Barcelona</Local> <Visita>Sevilla</Visita> <Goles-Local>2</Goles-Local> <Goles-Visita>1</Goles-Visita> </Partido> </Liga> A partir de los datos "Goles-Local" y "Goles-Visita" podramos realizar clculos, por ejemplo, si: Goles-Local > Goles-Visita Goles-Local < Goles-Visita Goles-Local = Goles-Visita ----> ----> ----> Gan el equipo local Perdi el equipo local Hubo empate entre el equipo local y el visitante.

Implementar XML-RPC en PHP


05-08-2008

PROGRAMACIN, DESARROLLO WEB 13813 HITS (100 %) 8 COMENTARIOS

Algo que interesante de WordPress es que podemos escribir nuevos contenidos a travs de software de escritorio como, por citar un ejemplo,Windows Live Writer. Aunque en realidad WordPress no es nico CMS que provee est caracterstica, a travs de ste me di cuenta que usa un archivo llamado xmlrpc.php. Me puse averiguar estos trminos: XML-RPC. En Wikipediaencontramos una definicin ms que satisfactoria: ... es un protocolo de llamada a procedimiento remoto que usa XML para codificar los datos yHTTP como protocolo de transmisin de mensajes
.

Es un protocolo muy simple ya que slo define unos cuantos tipos de datos y comandos tiles, adems de una descripcin completa de corta extensin. La simplicidad del XML-RPC est en contraste con la mayora de protocolos RPC que tiene una documentacin extensa y requiere considerable soporte de software para su uso. [...] Existen implementaciones para varios sistemas operativos, lenguajes de programacin, licencias comerciales y de software libre. Llamar a procedimientos remotos usando XML enviandolo por HTTP. As poda entender mejor como las aplicaciones de escritorio para escribir contenidos en los blogs funcionaban. Eso quiere decir que puedo enviar datos de un aplicacin hecha con cierto lenguaje de programacin a otra aplicacin desarrollada con un lenguaje distinto usando este protocolo. Como menciona la definicin XML-RPC: existen implementaciones para varios lenguajes de programacin. Lo cual nos indica que algunos lenguajes no traen de forma nativa funciones que manejen este protocolo, por lo que se ayudan de algunas libreras extras (ver cmo podemos implementar con distintos lenguajes de programacin). En el caso de PHP existen muchas libreras para implementar XML-RPC, y as usarlo en nuestras aplicaciones. Una de estas, y que me parecio simple de usar, es phpxmlrpc. Para mostrar el funcionamiento, veamos el siguiente ejemplo, que por cierto lo encontre en un blog en espaol, aunque hize algunas pequeas modificaciones para que funcionar correctamente. En la parte del cliente se mostrar un formulario donde permita escribir el cdigo ISBN de un libro. Se usar la librera phpxmlrpc para pedir informacin remota de un procedimiento que se encuentra en el servidor web.

dv_cliente.php
<form name="form1" method="post" action="dv_cliente.php"> <input type="text" name="txtIsbn"> <input type="submit" name="Submit" value="Buscar"> </form> <?php include("lib/xmlrpc.inc"); if (isset($HTTP_POST_VARS["txtIsbn"])){ $f=new xmlrpcmsg('libros.buscaIsbn',array(new xmlrpcval($HTTP_POST_VARS["txtIsbn"], "int"))); print "<pre>".htmlentities($f->serialize())."</pre>\n"; //$c=new xmlrpc_client("dv_servidor.php", "pecesama.ipowermysql.com", 80); $c=new xmlrpc_client("http://localhost/xmlrpc/dv_servidor.php"); $c->setDebug(0); $r=$c->send($f); if(!$r){ die("Fall SEND"); } $v=$r->value(); if(!$r->faultCode()){ print "Ttulo del libro ".$HTTP_POST_VARS["txtIsbn"]." es ".$v->scalarval()."<BR>"; }else{ print "Falla: "; print "Nmero de error: " .$r->faultCode()." Descripcin del error '".$r->faultString()."'<BR>"; } } ?>
Ahora la parte del procedimiento en el servidor, es una funcin en PHP que recibir datos de tipo entero. En este caso el ISBN de cierto libro.

dv_servidor.php
<?php //Ejemplo de un servidor XML-RPC en PHP

//Recibe un ISBN y regresa el Ttulo //del libro. include("lib/xmlrpc.inc"); include("lib/xmlrpcs.inc"); function BuscaIsbn($NoIsbn) { global $NoError; $err=""; // Obtenemos el parametro $ParIsbn=$NoIsbn->getParam(0); // Vemos si es del tipo correcto if(isset($ParIsbn) && ($ParIsbn->scalartyp()=="int")){ // Obtenemos el valor numerico $isbn=$ParIsbn->scalarval(); // Buscamos el libro switch($isbn){ case 1: $titulo="PHP"; break; case 2: $titulo="XML_RPC"; break; case 3: $titulo="Sitios web"; break; case 4: $titulo="Linux"; break; default:$NoError=1; $err="No hay libro ". "con el ISBN '". $isbn . "'"; } }else { // No es entero $err="Se requiere un nmero";} // Creamos la respuesta if ($err){ // Si hay error return new xmlrpcresp(0, $NoError, $err); }else{ // Si no hay error return new xmlrpcresp(new xmlrpcval($titulo)); } } //Creamos el servidor $s=new xmlrpc_server(array("libros.buscaIsbn"

=>array("function" => "BuscaIsbn"))); ?>


Para probar simplemente accede al archivo dv_cliente.php por web y escribe un numero cualquier y el procedimiento remoto mostrar la informacin pertinente.Y he all el funcionamiento de XMLPHP implementado en PHP. Aca hemos visto de manera muy rpida, al vuelo, sobre este protocolo: una definicin y un ejemplo a lo prctico. En proximos artculos ahondaremos ms sobre el tema. Si conoces algo de XMLRPC pues por qu no compartirlo?

Como generar un WebService XML con PHP y MySql


Posted by pjyac on sep 21, 2012 in Desarrollo WEB | 6 comments Existen diferentes formas de generar WebService, una de las formas ms fciles es generar un webservice tipo REST (representational state transfer) con extensin XML (Extensible Markup Language), en esta ocasin vamos a utilizar una base de datos MySql a donde vamos a leer la informacin y la librera de PHP DomDocument para construir el xml. Para poder realizar este ejercicio es necesario tener instalado un webserver en nuestro equipo local puede ser un XAMPP, APPServer, o cualquiera que sea compatible con PHP y MySql. Ahora veremos el cdigo para construir el webservice, e iremos comentando cada lnea para entenderlo de una forma mejor.
PHP < view plain text >

1. 2. 3. 4. 5. 6. 7. 8. 9.

<?php $con = mysql_connect("localhost","usuario","password"); //nos conectamos a nuestra base de datos if (!$con) { die('Could not connect: ' . mysql_error()); //verificamos que los datos sean correctos } // Seleccionamos la base de datos a utilizar

10. mysql_select_db("odk_prod", $con) or die ("error"); 11. $result = mysql_query("SELECT campo_tabla, campo_tabla2 ... * from

Nombre_tabla") or die ("error"); 12. //realizamos la consulta a nuestra base de datos 13. $test = array(); //creamos una variable de tipo array 14. $row_cnt = mysql_num_rows($result); //contamos el numero de filas devueltas por la consulta 15. while($row = mysql_fetch_array($result)) //recorremos todos las filas de nuestra consulta para leer los resultador 16. { 17. //ahora vamos a llenar el array con la informacin de la base de datos, necesitamos asignar un campo dentro del array para cada uno de los campos de la tabla 18. $test [] = array ('campo_array'=>$row['campo_tabla'], 'campo_array2'=>$row['campo_tabla2']); } //ya que tenemos lleno el array vamos a utilizarlo para generar nuestro archivo XML, usando la librera DOMDocument 19. //iniciamos la funcin DOMDocument

20. $doc = new DOMDocument(); $doc->formatOutput = true; //Ac creamos el primer elemento de nuestro xml llamado results, este elemento tiene un atributo llamado count, q devuelve el numero de registros que va a contener, esto lo obtenemos del numero de filas devueltas por la consulta 21. $r = $doc->createElement( "results" ); $r->setAttribute("count",$row_cnt);//abrimos la etiqueta results, q ser la principal 22. $doc->appendChild( $r ); 23. foreach( $test as $arraytest ) { //iniciamos a recorrer el array 24. //creamos la etiqueta result, q dentro contendra la informacin del campo1 y campo2 de la base de datos 25. $b = $doc->createElement( "data" ); $campo1 = $doc->createElement ( "campo1" ); 26. $campo1->appendChild( $doc->createTextNode( $arraytest['campo_array'] ) ); 27. $b->appendChild( $campo1 ); 28. $campo2 = $doc->createElement ( "campo2" ); 29. $campo2->appendChild( $doc->createTextNode( $arraytest['campo_array2'] ) );//cerramos la etiqueta data 30. $b->appendChild( $campo2 ); //cerramos la etiqueta resulsts 31. $r->appendChild( $b ); } //ponemos el nombre de nuestro archivo xml 32. $doc->save("nombre_doc.xml"); //cerramos la conexin a la base de datos 33. mysql_close($con); ?>

al finalizar este cdigo debera generarnos el archivo nombre_doc.xml y quedar estrucutrado de esta forma

XML < view plain text >

1. 2. 3. 4. 5. 6. 7. 8. 9. 10.

<?xml version="1.0"?> <results count="2"> <result> <campo1>informacin fila 1 campo 1</campo1> <campo2>informacin fila 1 campo 2</campo2> </result> <result> <campo1>informacin fila 2 campo 1</campo1> <campo2>informacin fila 2 campo 2</campo2> </result>

11. </results>

espero les sea de ayuda, cualquier duda o comentario por favor escribanme

6 comments
1.

Jonathan
29 enero, 2013

Justo lo que buscaba, muchas gracias voy a probarlo y te cuento como va.. solo una pregunta, como le hago para despues conectarme a ese archivo xml?? mediante una url??? esto lo pregunto porque yo estoy generando una pagina en donde tengo un formulario para agregar la informacion a la base de datos, despues voy a usar este para generar xml y despues necesito jalar la informacion del xml a mi pagina web para que mueste la informacion, esta ultima parte es la duda.. muchas gracias. Reply

pjyac
30 enero, 2013

Me alegro mucho de que te sea de utilidad, para consumir este servicio podemos utilizar una librera de php llamada simplexml_load_file te adjunto los links de dos pginas en las cuales se explica el uso de esta librera espero sean de ayuda http://www.forosdelweb.com/f18/leer-xml-con-simple-xml-php-967754/ (revisa el ultimo cometario de esta pagina) http://www.php.net/manual/es/function.simplexml-load-file.php Reply

2.

Jos Luis Zamora


30 enero, 2013

Hola, antes que nada gracias por el ejemplo. te comento lo ejecuto pero me marca error en esta linea xml $doc->save(nombre_doc.xml); aqui incluyo el codigo modificado, espero me puedas ayudr. $row['ItemCode'], itemname=> $row['ItemName']); //ya que tenemos lleno el array vamos a utilizarlo para generar nuestro archivo XML, usando la librera DOMDocument } //iniciamos la funcin DOMDocument $doc = new DOMDocument();

$doc->formatOutput = true; //creamos el primer elemento de nuestro xml llamado results, este elemento tiene un atributo llamado count, q devuelve el numero de registros que va a contener, esto lo obtenemos del numero de filas devueltas por la consulta $r = $doc->createElement( results ); $r->setAttribute(count,$row_cnt); //abrimos la etiqueta results, q ser la principal $doc->appendChild( $r ); foreach( $test as $arraytest ) //iniciamos a recorrer el array { //creamos la etiqueta result, q dentro contendra la informacin del campo1 y campo2 de la base de datos $b = $doc->createElement( data ); $campo1 = $doc->createElement (itemcode); $campo1->appendChild( $doc->createTextNode( $arraytest['itemcode'] ) ); $b->appendChild( $campo1 ); $campo2 = $doc->createElement ( itemcode ); $campo2->appendChild( $doc->createTextNode( $arraytest['itemname'] ) ); //cerramos la etiqueta data $b->appendChild( $campo2 ); //cerramos la etiqueta resulsts $r->appendChild( $b ); } //ponemos el nombre de nuestro archivo xml $doc->save(nombre_doc.xml); //cerramos la conexin a la base de datos mysql_close($con); ?> Reply

3.

Jos Luis Zamora


30 enero, 2013

Creo que no paso completo el codigo te lo vuelvo a poner. saludos $con = mysql_connect(localhost,root,"); //nos conectamos a nuestra base de datos if (!$con) { die(Could not connect: . mysql_error());

//verificamos que los datos sean correctos } // Seleccionamos la base de datos a utilizar mysql_select_db(personal, $con) or die (error); $result = mysql_query(SELECT * FROM inventario) or die (error); //realizamos la consulta a nuestra base de datos $test = array(); //creamos una variable de tipo array $row_cnt = mysql_num_rows($result); //contamos el numero de filas devueltas por la consulta while($row = mysql_fetch_array($result)) //recorremos todos las filas de nuestra consulta para leer los resultador { //ahora vamos a llenar el array con la informacin de la base de datos, necesitamos asignar un campo dentro del array para cada uno de los campos de la tabla $test [] = array (itemcode=>$row['ItemCode'], itemname=> $row['ItemName']); //ya que tenemos lleno el array vamos a utilizarlo para generar nuestro archivo XML, usando la librera DOMDocument } //iniciamos la funcin DOMDocument $doc = new DOMDocument(); $doc->formatOutput = true; //creamos el primer elemento de nuestro xml llamado results, este elemento tiene un atributo llamado count, q devuelve el numero de registros que va a contener, esto lo obtenemos del numero de filas devueltas por la consulta $r = $doc->createElement( results ); $r->setAttribute(count,$row_cnt); //abrimos la etiqueta results, q ser la principal $doc->appendChild( $r ); foreach( $test as $arraytest ) //iniciamos a recorrer el array { //creamos la etiqueta result, q dentro contendra la informacin del campo1 y campo2 de la base de datos $b = $doc->createElement( data ); $campo1 = $doc->createElement (itemcode); $campo1->appendChild( $doc->createTextNode( $arraytest['itemcode'] ) ); $b->appendChild( $campo1 ); $campo2 = $doc->createElement ( itemcode ); $campo2->appendChild( $doc->createTextNode( $arraytest['itemname'] ) ); //cerramos la etiqueta data $b->appendChild( $campo2 ); //cerramos la etiqueta resulsts $r->appendChild( $b ); } //ponemos el nombre de nuestro archivo

xml $doc->save(nombre_doc.xml); //cerramos la conexin a la base de datos mysql_close($con); [PHP] Reply

4.

Jos Luis Zamora


30 enero, 2013

Ya funciono el codigo funca de maravilla solo quite xml y dejandolo asi $doc->save(nombre_doc.xml); Reply

pjyac
31 enero, 2013

Perdn por no responder antes

, gracias por la observacin, ayer se me desactivo

un plug-in que tengo para mostrar de una forma ms amigable el cdigo, ahora ya esta funcionando, por eso te dio el error, ese xml era del comentario de la lnea anterior, mil gracias por visitarme

Aunque utilizar estas dos tecnologas juntas no excluye usar bases de datos, eso es lo mejor de todo!. En la segunda parte de este artculo veremos con juntar estas tres tecnologas para darle rienda suelta a nuestra imaginacin. Vamos al lo. Para empezar vamos a crear nuestro archivo XML de ejemplo, al que llamaremos "noticias.xml" (por ser un poquito originales ;-) ):
<?xml version="1.0" encoding="ISO-8859-1"?> <bloque> <noticia> <titulo>Hola Caracola </titulo> <autor>KaoS</autor> <cuerpo>Olla Kaitos a Luisete</cuerpo> </noticia> <noticia> <titulo>Nuevo articulo en desarrolloweb </titulo> <autor>Raul</autor> <cuerpo>Jeje hola, aqui estamos </cuerpo> </noticia> </bloque>

Bueno ya tenemos creado nuestro archivo XML, que como ya sabemos nos permite crear nuestras propias etiquetas, aunque segn en que estemos trabajando ser recomendable seguir los estandars establecidos por elw3c. Ahora necesitamos crear un archivo PHP que lea nuestro archivo "noticias.xml". Como podemos hacer esto? , pues es muy simple, porque PHP ya incluye ciertas funciones para el trabajo con archivos XML.Nosotros vamos a utilizar unas funciones que trabajan sobre PHP 4 ya que an no todo el mundo tiene PHP 5 en su servidor, pero la forma de trabajar es muy similar. Dejo aqu una referencia de como trabajar del mismo modo pero usando las funciones de PHP 5. Vamos a trabajar. Lo primero que tenemos que hacer es leer el archivo, para ello utilizaremos nuestra queridsima funcin fopen. Da igual si el archivo se encuentra en nuestro servidor o no, por lo que si nos interesa podriamos crear un archivo PHP que funcionara igualmente en un servidor remoto que leyese las noticias de nuestra web.
//$ruta_fichero="http://www.dominio.com/noticias.xml"; $ruta_fichero="noticias.xml"; $contenido = ""; if($da = fopen($ruta_fichero,"r")) { while ($aux= fgets($da,1024)) { $contenido.=$aux; } fclose($da); } else

{ echo "Error: no se ha podido leer el archivo <strong>$ruta_fichero</strong>"; }

Si todo ha ido correctamente ahora tendremos nuestro fichero XML cargado en nuestra variable $contenidoAhora un detalla, debido a que nuestras notcias podran tener caracteres especiales, para evitar fallos le meteremos un pequeo filtro, que en este caso por ejemplo vamos a sustituir las tldes y las ees en el caso de que las hubiesen, para ello utilizaremos la funcin ereg_replace.
$contenido=ereg_replace("","a",$contenido); $contenido=ereg_replace("","e",$contenido); $contenido=ereg_replace("","i",$contenido); $contenido=ereg_replace("","o",$contenido); $contenido=ereg_replace("","u",$contenido); $contenido=ereg_replace("","A",$contenido); $contenido=ereg_replace("","E",$contenido); $contenido=ereg_replace("","I",$contenido); $contenido=ereg_replace("","O",$contenido); $contenido=ereg_replace("","U",$contenido); $contenido=ereg_replace("","NI",$contenido); $contenido=ereg_replace("","ni",$contenido);

El siguiente paso es cargar nuestro archivo XML en una estructura que podamos trabajar con PHP de forma comoda, para esta tarea vamos a utilizar las funciones dom que vienen implementadas a partir de la versin 4 de PHP. Concretamente usaremos:

domxml_open_mem : Crea un objeto DOM desde un documento XML document_element : Crear un nuevo nodo de tipo elemento get_elements_by_tagname: Obtiene elementos por el nombre de etiqueta get_content : Obtiene el contenido del nodo

$tagnames = array ("titulo","autor","cuerpo"); if (!$xml = domxml_open_mem($contenido)) { echo "Ha ocurrido un error al procesar el documento<strong> \"$ruta_fichero\"</strong> a XML <br>"; exit; } else { $raiz = $xml->document_element(); $tam=sizeof($tagnames); for($i=0; $i<$tam; $i++) { $nodo = $raiz->get_elements_by_tagname($tagnames[$i]); $j=0; foreach ($nodo as $etiqueta) { $matriz[$j][$tagnames[$i]]=$etiqueta->get_content(); $j++; } }

Analicemos ms detenidamente este ltimo trozo de cdigo a ver que es lo que realmente hace. Para empezar hemos creado un array con los campos que contiene cada noticia en la variable "tagnames". A continuacin cargamos la variable contenido en un objeto DOM, en el caso de que todo haya ido bien extraemos el nodo raiz, en nuetro caso "bloque". El siguiente paso es calcular

el numero de campos que obtendremos de cada noticia, para ello utilizamos la funcin sizeof que nos devuelve el tamao del array. Es ahora cuando extraemos la verdadera informacin del documento XML. Esta informacin la vamos a introducir en una matriz para que nos sea ms simple trabajar con los datos. De forma que matriz quedase algo as: indice \ Nombre Columna titulo 0 1 Hola Caracola autor cuerpo KaoS Olla Kaitos a Luisete

Nuevo articulo en desarrolloweb Raul Jeje hola, aqui estamos

El primer bucle extrae las etiquetas de los nodos (primero titulo, despues autor y luego cuerpo). El foreach se encarga de sacar una a una las etiquetas de cada una de las noticias, por lo que primero extrae "Hola Caracola" y en la segunda iteracin "Nuevo articulo en desarrolloweb". De este modo vamos guardando en nuestra matriz los datos extraidos. En la segunda iteracin(repeticin) del bucle for cogeremos la etiqueta autor, y en el foreach extraeremos los valores para introducirlos en nuetra matriz. Y as hasta terminar. Lo mejor de todo es que de esto se encarga nuestro propio bucle!, nosotros solo tendremos que preocuparlos de declarar el array de etiquetas. Bueno para que nos sea ms comodo podemos crear una funcin a la que le pasaremos el archivo XML que queremos que nos lea y nos devuelva una matriz con los datos, haciendo as nuestro trabajo ms limpio y eficiente. El cdigo resultante sera:
function CargarXML($ruta_fichero) { $contenido = ""; if($da = fopen($ruta_fichero,"r")) { while ($aux= fgets($da,1024)) { $contenido.=$aux; } fclose($da); } else { echo "Error: no se ha podido leer el archivo <strong>$ruta_fichero</strong>"; } $contenido=ereg_replace("","a",$contenido); $contenido=ereg_replace("","e",$contenido); $contenido=ereg_replace("","i",$contenido); $contenido=ereg_replace("","o",$contenido); $contenido=ereg_replace("","u",$contenido); $contenido=ereg_replace("","A",$contenido); $contenido=ereg_replace("","E",$contenido); $contenido=ereg_replace("","I",$contenido); $contenido=ereg_replace("","O",$contenido); $contenido=ereg_replace("","U",$contenido);

$contenido=ereg_replace("","NI",$contenido); $contenido=ereg_replace("","ni",$contenido); $tagnames = array ("titulo","autor","cuerpo"); if (!$xml = domxml_open_mem($contenido)) { echo "Ha ocurrido un error al procesar el documento<strong> \"$ruta_fichero\"</strong> a XML <br>"; exit; } else { $raiz = $xml->document_element(); $tam=sizeof($tagnames); for($i=0; $i<$tam; $i++) { $nodo = $raiz->get_elements_by_tagname($tagnames[$i]); $j=0; foreach ($nodo as $etiqueta) { $matriz[$j][$tagnames[$i]]=$etiqueta->get_content(); $j++; } } return $matriz; } }

Bueno, pues esto ya est casi todo listo, ya hemos cargado una matriz con el contenido de un archivo XML, por lo que ahora solo nos queda mostrar la informacin que queramos. Vamos a ver en un pequeo cdigo como hacerlo.
$matriz=CargarXML("noticias.xml"); $num_noticias=sizeof($matriz); for($i=0;$i<$num_noticias;$i++) { echo ' <table border=1> <tr><td align=center>'.$matriz[$i]["titulo"].'</td></tr> <tr><td>'.$matriz[$i]["cuerpo"].'</td></tr> <tr><td align=right >'.$matriz[$i]["autor"].'</td></tr> </table><br> '; }

Voil, ya tenemos nuestro primer ejemplo de XML+PHP. Aqu podeis ver el ejemplo funcionando:archivo xml y archivo xml formateado. Bueno esto ha sido todo por hoy, espero que os haya sido de utilidad el artculo.

Como Trabajar con DOM/XML


Por: agrana Saludos Amigos...

06/8/2009

0 votos

Me Costo un mundo poder ver como trabaja DOM XML de PHP de 5 en adelante ... 1.- Las librerias en las versiones PHP de 5 en adelante esta complidas es decir ya no es una extension.. 2.- Por Otra parte el codigo que voy a facilitar va enviar lo siguiente a una archivo <?xml version="1.0" encoding="UTF-8"?> <rows> <row id="1"> <cell>Grupo No.1</cell> <cell>GRUPO UNO</cell> </row> <row id="2"> <cell>Grupo No.2</cell> <cell>MARCOS</cell> </row> <row id="3"> <cell>Grupo No.3</cell> <cell>POPEYE</cell> </row> </rows> PUEDEN NOTAR QUE EL XML va dentro de otras etiquetas es decir ROWS (Indice Principal) ROW (los Sudindices) y CELL (las Celdas)... De la misma Manera vamos a tratar el codigo en PHP.... y aqui va el codigo... $doc = new DOMDocument ( '1.0', 'UTF-8' ); /// Abrimos el DOMXML Documento $element = $doc->appendChild(new DOMElement('rows')); // Creamos el Indice Principal ROWS $i=1; $resultj = mysql_query("SELECT * FROM _tgrupo order by IDG"); // Una Simple Intruccion SQL para mostrar un el ejemplo while($Row = mysql_fetch_array($resultj)) { // Esto es muy Importante Fijense Bien $element fue la misma variable para llamar la Instruccion en el INDICE ROWS en otras palabras estamos indicando que este nuevo elemento pertenece al INDICE ROWS.. $element1 = $element->appendChild(new DOMElement('row')); $element1->setAttribute("id", $i); /// Para asiganar el atributo ID // Aqui pasa lo mismo si ven los apuntadores ahora llaman a $element1 para que ellos pertenezcan al SUBINDICE ROW, en este caso ahora a dos etiquetas llamadas CELL $element_ns = new DOMElement('cell', 'Grupo No.'.$Row['IDG'], ''); $element1->appendChild($element_ns);

$element_ns = new DOMElement('cell', $Row['Descrip'], ''); $element1->appendChild($element_ns); $i++; } $doc->save("grid.xml"); /// <== Aqui lo grabamos a un archivo .XML

Si tiene alguna duda escriban a mi correo.. creo que la explicacion de este articulo esta bien pero es hacer las cosas casi a mano.. y no es la idea PHP es muy poderoso para hacer un archivo tan escueto... mi correo:angelgranadillo@yahoo.com Espero que le sirva de mucho

Uso bsico de SimpleXML


Muchos ejemplos en esta referencia requieren un string XML. En vez de repetir este string en cada ejemplo, se ha puesto en un fichero que se incluye en cada ejemplo. Este fichero se muestra en la siguiente seccin de ejemplo. Alternativamente, puede crearse un document XML y leerlo con simplexml_load_file(). Ejemplo #1 ejemplo.php, fichero a incluir con el string XML
<?php $xmlstr = <<<XML <?xml version='1.0' standalone='yes'?> <peliculas> <pelicula> <titulo>PHP: Tras el Parser</titulo> <personajes> <personaje> <nombre>Srta. Programadora</nombre> <actor>Onlivia Actora</actor> </personaje> <personaje> <nombre>Sr. Programador</nombre> <actor>El Actor</actor> </personaje> </personajes> <argumento> As que, este lenguaje. Es como, un lenguaje de programacin. O es un lenguaje interpretado? Lo descubrirs en esta intrigante y temible parodia de un documental. </argumento> <grandes-lineas> <linea>PHP soluciona todos los problemas web</linea> </grandes-lineas> <puntuacion tipo="pulgares">7</puntuacion> <puntuacion tipo="estrellas">5</puntuacion> </pelicula> </peliculas>

XML; ?>

La simplicidad de SimpleXML se ve claramente cuando se extrae un string o un nmero de un documento XMl bsico. Ejemplo #2 Obteniendo <argumento>
<?php include 'ejemplo.php'; $peliculas = new SimpleXMLElement($xmlstr); echo $peliculas->pelicula[0]->argumento; ?>

El resultado del ejemplo sera:


As que, este lenguaje. Es como, un lenguaje de programacin. O es un lenguaje interpretado? Lo descubrirs en esta intrigante y temible parodia de un documental.

El acceso a elementos dentro de un documento XML que contienen caracteres no permitidos por la convencin de nombres de PHP (por ejemplo, el guin) puede realizarse encapsulando el nombre del elemento dentro de un par de llaves y comillas simples. Ejemplo #3 Obteniendo <linea>
<?php include 'example.php'; $peliculas = new SimpleXMLElement($xmlstr); echo $peliculas->pelicula->{'grandes-lineas'}->linea; ?>

El resultado del ejemplo sera:


PHP soluciona todos los problemas web

Ejemplo #4 Accediendo a elementos no nicos en SimpleXML Cuando existen mltiples instancias de un elemento como hijos de un nico elemento padre, se aplican las tcnicas normales de iteracin.
<?php include 'example.php'; $peliculas = new SimpleXMLElement($xmlstr); /* Para cada <personaje>, mostramos cada <nombre>. */ foreach ($peliculas->pelicula->personajes->personaje as $personaje) { echo $personaje->nombre, ' interpretado por ', $personaje->actor, PHP_EOL; }

?>

El resultado del ejemplo sera:


Srta. Programadora interpretado por Onlivia Actora Sr. Programador interpretado por El Actor

Nota: Las propiedades ($peliculas->pelicula en el ejemplo anterior) no son arrays. Son objetos iterables y accesibles. Ejemplo #5 Usando atributos Hasta aqu, nicamente se ha cubierto el trabajo de leer nombres de elementos y sus valores. SimpleXML puede tambin acceder a los atributos de los elementos. Para acceder a ellos, se realiza de la misma forma que si fuesen elementos de un array.
<?php include 'example.php'; $peliculas = new SimpleXMLElement($xmlstr); /* Acceso a los nodos <puntuacion> de la primera pelcula. * Mostramos la escala (tipo) tambin. */ foreach ($peliculas->pelicula[0]->puntuacion as $puntuacion) { switch((string) $puntuacion['tipo']) { // Toma los atributos como ndices de l elemento case 'pulgares': echo $puntuacion, ' votos positivos'; break; case 'estrellas': echo $puntuacion, ' estrellas'; break; } } ?>

El resultado del ejemplo sera:


7 votos positivos5 estrellas

Ejemplo #6 Comparando elementos y atributos con texto Para comparar un elemento o atributo con un string o pasarlo a una funcin que requiera un string, debe realizarse un cast a string usando (string). Si no se realiza de esta forma, PHP trata al elementos como un objeto.
<?php include 'example.php'; $peliculas = new SimpleXMLElement($xmlstr); if ((string) $peliculas->pelicula->titulo == 'PHP: Tras el Parser') { print 'Mi pelcula favorita.';

} echo htmlentities((string) $peliculas->pelicula->titulo); ?>

El resultado del ejemplo sera:


Mi pelcula favorita.PHP: Tras el Parser

Ejemplo #7 Comparando dos elementos Dos SimpleXMLElements son considerados distintos an cuando ambos apuntan al mismo elemento desde PHP 5.2.0.
<?php include 'example.php'; $pelicula1 = new SimpleXMLElement($xmlstr); $pelicula2 = new SimpleXMLElement($xmlstr); var_dump($pelicula1 == $pelicula2); // false desde PHP 5.2.0 ?>

El resultado del ejemplo sera:


bool(false)

Ejemplo #8 Usando XPath SimpleXML incorpora soprote XPath. Para encontrar todos los elementos <personaje>:
<?php include 'example.php'; $peliculas = new SimpleXMLElement($xmlstr); foreach ($peliculas->xpath('//personaje') as $personaje) { echo $personaje->nombre . ' interpretado por ' . $personaje->actor, PHP_EOL; } ?>

'//' acta un comodn. Para especificar una ruta absoluta, hay que omitir una de las dos barras. El resultado del ejemplo sera:
Srta. Programadora interpretado por Onlivia Actora Sr. Programador interpretado por El Actor

Ejemplo #9 Estableciendo valores Los datos en SimpleXML no tienen que ser constantes. El objeto permite que se manipulen todos sus elementos.
<?php include 'example.php'; $peliculas = new SimpleXMLElement($xmlstr); $peliculas->pelicula[0]->personajes->personaje[0]>nombre = 'Seorita Programadora'; echo $peliculas->asXML(); ?>

El resultado del ejemplo sera:


<?xml version="1.0" standalone="yes"?> <peliculas> <pelicula> <titulo>PHP: Tras el Parser</titulo> <personajes> <personaje> <nombre>Srta. Programadora</nombre> <actor>Onlivia Actora</actor> </personaje> <personaje> <nombre>Sr. Programador</nombre> <actor>El Actor</actor> </personaje> </personajes> <argumento> As que, este lenguaje. Es como, un lenguaje de programacin. O es un lenguaje interpretado? Lo descubrirs en esta intrigante y temible parodia de un documental. </argumento> <grandes-lineas> <linea>PHP soluciona todos los problemas web</linea> </grandes-lineas> <puntuacion tipo="pulgares">7</puntuacion> <puntuacion tipo="estrellas">5</puntuacion> </pelicula> </peliculas> +

Ejemplo #10 Aadiendo elementos y atributos Desde PHP 5.1.3, SimpleXML tiene la capacidad de aadir fcilmente hijos y atributos.
<?php include 'example.php'; $peliculas = new SimpleXMLElement($xmlstr); $character = $peliculas->pelicula[0]->personajes->addChild('personaje'); $character->addChild('nombre', 'Sr. Parser'); $character->addChild('actor', 'John Doe'); $rating = $peliculas->pelicula[0]->addChild('puntuacion', 'Todos los pblicos'); $rating->addAttribute('tipo', 'clasificacin'); echo $peliculas->asXML(); ?>

El resultado del ejemplo sera:


<?xml version="1.0" standalone="yes"?> <peliculas> <pelicula> <titulo>PHP: Tras el Parser</titulo> <personajes> <personaje> <nombre>Srta. Programadora</nombre> <actor>Onlivia Actora</actor>

</personaje> <personaje> <nombre>Sr. Programador</nombre> <actor>El Actor</actor> </personaje> </personajes> <argumento> As que, este lenguaje. Es como, un lenguaje de programacin. O es un lenguaje interpretado? Lo descubrirs en esta intrigante y temible parodia de un documental. </argumento> <grandes-lineas> <linea>PHP soluciona todos los problemas web</linea> </grandes-lineas> <puntuacion tipo="pulgares">7</puntuacion> <puntuacion tipo="estrellas">5</puntuacion> </pelicula> </peliculas>

Ejemplo #11 Interoperatibilidad DOM PHP tiene un mecanismo para convertor nodos XML entre los formatos SimpleXML y DOM. Este ejemplo muestra como cambiar un elemento DOM a SimpleXML.
<?php $dom = new DOMDocument; $dom->loadXML('<libros><libro><titulo>blah</titulo></libro></libros>'); if (!$dom) { echo 'Error al analizar el documento'); exit; } $s = simplexml_import_dom($dom); echo $s->libro[0]->titulo; ?>

El resultado del ejemplo sera:


blah

Lidiar con los errores XML


*edit+ Last updated: Fri, 19 Jul 2013

Ejemplos

add a noteUser Contributed Notes

Uso bsico de SimpleXML - [8 notes]

up down

10

ie dot raymond at gmail dot com 3 years ago


If you need to output valid xml in your response, don't forget to set your header content type to xml in addition to echoing out the result of asXML(): <?php $xml=simplexml_load_file('...'); ... ...xml stuff ... //output xml in your response: header('Content-Type: text/xml'); echo $xml->asXML(); ?>

up down

6
jishcem at gmail dot com 4 months ago
For me it was easier to use arrays than objects, So, I used this code, $xml = simplexml_load_file('xml_file.xml'); $json_string = json_encode($xml); $result_array = json_decode($json_string, TRUE); Hope it would help someone

up down

1
Max K. 3 years ago
From the README file: SimpleXML is meant to be an easy way to access XML data.

SimpleXML objects follow four basic rules: 1) 2) 3) 4) properties denote element iterators numeric indices denote elements non numeric indices denote attributes string conversion allows to access TEXT data

When iterating properties then the extension always iterates over all nodes with that element name. Thus method children() must be called to iterate over subnodes. But also doing the following: foreach ($obj->node_name as $elem) { // do something with $elem } always results in iteration of 'node_name' elements. So no further check is needed to distinguish the number of nodes of that type. When an elements TEXT data is being accessed through a property then the result does not include the TEXT data of subelements. Known issues ============ Due to engine problems it is currently not possible to access a subelement by index 0: $object->property[0].

up down

1
php at keith tyler dot com 3 years ago
[Editor's Note: The SimpleXMLIterator class, however, does implement these methods.] While SimpleXMLElement claims to be iterable, it does not seem to implement the standard Iterator interface functions like ::next and ::reset properly. Therefore while foreach() works, functions like next(), current(), or each() don't seem to work as you would expect -- the pointer never seems to move or keeps getting reset.

up down

1
kdos

2 years ago
Using stuff like: is_object($xml->module->admin) to check if there actually is a node called "admin", doesn't seem to work as expected, since simplexml always returns an object- in that case an empty one - even if a particular node does not exist. For me good old empty() function seems to work just fine in such cases. Cheers

up down

1
bjorn at xQmail dot eu 3 years ago
If you're not sure the XML will be valid you'd better use: <?php $xmlObject = simplexml_load_string($xml); // or $xmlObject = simplexml_load_file(xml); ?> Both of these return a SimpleXMLElement Object or a libXMLError Object.

up down

-2
radams at circlepix com 4 years ago
To test whether an element exists: <?php $xml = <<<EOT <?xml version='1.0' standalone='yes'?> <root> <test1></test1> <test2 /> <test4> </test4> </root> EOT; $xmlDoc = new SimpleXMLElement($xml);

echo "Test1: \n"; var_dump($xmlDoc->test1); echo "\n(" . (bool)$xmlDoc->test1 . ")"; echo "\n\n"; echo "Test2: \n"; var_dump($xmlDoc->test2); echo "\n(" . (bool)$xmlDoc->test2 . ")"; echo "\n\n"; echo "Test3: \n"; var_dump($xmlDoc->test3); echo "\n(" . (bool)$xmlDoc->test3 . ")"; echo "\n\n"; echo "Test4: \n"; var_dump($xmlDoc->test4); echo "\n(" . (bool)$xmlDoc->test4 . ")"; echo "\n\n"; ?> The var_dumps for test1, test2, and test3 are identical, but the (bool) test gives a '1' for test1 and test2, and a '' for test3.

up down

-1
gkokmdam at zonnet dot nl 2 years ago
A quick tip on xpath queries and default namespaces. It looks like the XMLsystem behind SimpleXML has the same workings as I believe the XML-system .NET uses: when one needs to address something in the default namespace, one will have to declare the namespace using registerXPathNamespace and then use its prefix to address the otherwise in the default namespace living element. <?php $string = <<<XML <?xml version='1.0'?> <document xmlns="http://www.w3.org/2005/Atom"> <title>Forty What?</title> <from>Joe</from> <to>Jane</to> <body> I know that's the answer -- but what's the question? </body>

</document> XML; $xml = simplexml_load_string($string); $xml->registerXPathNamespace("def", "http://www.w3.org/2005/Atom"); $nodes = $xml->xpath("//def:document/def:title"); ?>

Ejemplos
Tabla de contenidos

Uso bsico de SimpleXML Lidiar con los errores XML

Uso bsico de SimpleXML


[edit] Last updated: Fri, 19 Jul 2013

Constantes predefinidas

add a noteUser Contributed Notes

Ejemplos - [9 notes]

up down

10
Juan Herrera 3 years ago
When using simplexml to access a element the returned object may be a SimpleXMLElement instead of a string. Example:

<?php

$string = <<<XML
<?xml version='1.0'?> <document> <cmd>login</cmd> <login>Richard</login> </document> XML;

$xml = simplexml_load_string($string); print_r($xml); $login = $xml->login; print_r($login); $login = (string) $xml->login; print_r($login); ?>
Expected result: ---------------SimpleXMLElement Object ( [cmd] => login [login] => Richard ) Richard Richard Actual result: -------------SimpleXMLElement Object ( [cmd] => login [login] => Richard ) SimpleXMLElement Object ( [0] => Richard ) Richard But this is an intended behavior. See http://bugs.php.net/bug.php?id=29500

up down

1
Kari P. 4 years ago

To take care of proper error checking, one must use try-catch blocks:

<?php
try {

$sxe = new SimpleXMLElement($xmlstring); } catch (Exception $e) { echo "bad xml"; } ?>
To get rid of warnings, use @ in front of new:

<?php
try {

$sxe = @new SimpleXMLElement($xmlstring); } catch (Exception $e) { echo "bad xml"; } ?> up down

0
dipl dot paed dot thomas dot schaefer at web dot de 5 years ago

<?php
class QXML { ... protected function _toXML( $xmlArray, $elmName='graph', $elmCloseTag="", $level=0) { $xmlString = ""; if(is_array($xmlArray)){ $strXmlAttributes = ""; $key_xml = ""; $keysXmlArray = array_keys($xmlArray); $curLevel = $level + 1; if(in_array(self::attribute,$keysXmlArray)){ if(isset($xmlArray[self::attribute])){ if(is_array($xmlArray[self::attribute])){ foreach($xmlArray[self::attribute] as $xmlArrayKey => $xmlArrayValue)

$strXmlAttributes .= sprintf(' %s="%s"', $xmlArrayKey, addslashes($xmlArrayValue));


} } } unset($xmlArray[self::attribute]); } if(in_array(self::textNode,$keysXmlArray)){ if(isset($xmlArray[self::textNode])){ if($xmlArray[self::textNode]){ $key_xml = $xmlArray[self::textNode]; } if(strlen($ky_xml)){ $key_xml = sprintf("<![CDATA[%s]]>",$key_xml); } else { $key_xml = ""; } } unset($xmlArray[self::textNode]); } $keysXmlArray=array_keys($xmlArray); if($elmCloseTag){ $indent=str_repeat(" ",$level * 5); $xmlString .="\n".$indent. "<".$elmCloseTag.$strXmlAttributes.">". $key_xml; } if(is_array($xmlArray) && count($xmlArray)>0 && count($keysXmlArray)>0) { reset($xmlArray); foreach($keysXmlArray as $key){ $altKey = $altKeyXml = $xmlArray[$key]; $check = false; foreach(array_keys($altKeyXml) as $j=>$p){ if(is_numeric($j)){ $check=true; $xmlString.= $this->_toXML( $altKeyXml[$j], "", $key,

$curLevel
); unset($altKeyXml[$j]); } }

if($check){ $altKey = $altKeyXml; } if($altKey){ $xmlString .= $this->_toXML($altKey,"",$key,$curLevel); } } } if($elmCloseTag){ $xmlString.= (count($xmlArray)>0?"\n".$indent:""). "</".$elmCloseTag.">"; } } if($elmName) { $xmlString = "<?xml version='1.0' encoding='UTF-8'?>\n$xmlString\n"; } return $xmlString; } ... }

?> up down

0
david b 5 years ago
Use eval() when using variable variables to access SimpleXML nodes. e.g.

<?php
include 'example.php';

$xml = new SimpleXMLElement($xmlstr); $s = 'movie[0]->plot' ;


echo "\n1: OK " . $xml->movie[0]->plot ; // OK echo "\n2: FAIL " . $xml->$s ; // FAIL echo "\n3: OK " . eval( "return \$xml->$s ;" ) ;

// OK

?> up

down

-1
info at accountr dot eu 4 years ago
Instead of using

<?php eval($code) ?>

you can use this method,

<?php $node = "node"; $XML = simplexml_load_file($file); $text = (string)$XML->nodes->{$node}; // works


// or

$text2 = (string)$XML->{$node}->child; // also works fine ?>


I think it is much more easier instead of eval().

up down

0
Honeymonster 5 years ago
@david b @Fabi W Why can't you use the ->{} operators? e.g $xml->{$node} I've not tested this, but see no reason why it would not work.

up down

Fabi W 5 years ago


@david b's approach of dynamically accessing xml-elements: You can explode the dynamic var with '->' as seperator and thus build a simple function to get the element function simplexml_get_node_by_query($sxml_obj, $query) { $nodes = explode("->", $query); $currTree = $sxml_obj; foreach($nodes as $node) { $currTree = $currTree->$node; } return $currTree; }

up down

0
mike at mike-griffiths dot co dot uk 5 years ago
It is important that you select the correct method of loading the XML in depending on the format of your XML file. If you use the wrong function to load it in you will get some strange errors.

up down

-3
Edward Rudd 4 years ago
If you need to updated the content of a node selected via Xpath use [0]. Example.

<?php $x = new SimpleXMLElement(<<<EOXML


<root> <node>Some Text</node> </root> EOXML

);

$nodes = $x->xpath('/root/node');
// This does not work // $nodes[0] = "My New Text"; $nodes[0][0] = "My New Text"; echo $x->asXML();

?>
Note that this for some reason doesn't work.

<?php $node = $nodes[0]; $nodes[0] = "My New Text"; ?>


It throw an exception "Object ($node) don't support array access operators"
add a note

show source Copyrig

credits

stats

sitemap

contact

advertising

mirror sites