Introducción
Cuando manipulamos documentos XML [1] desde PHP [2] uno de los “quebraderos” de cabeza son los namespaces. Un namespace no es nada complicado ni rocambolesco como algunos opinan; no deja de ser un enriquecimiento semántico para dotar de más información a un documento XML.
Tradicionalmente los desarrolaldores PHP no se han complicado con este concepto. Pero hoy en día con la cantidad de mensajes y documentos XML que envían mediante REST, SOAP, APIs de terceros, etc. es inevitable y totalmente recomendable conocer como manipularlos de forma sencilla en PHP.
Caso de uso: Google shopping
Por lo general cualquier documento XML generado por y para Google tendrá en namespace http://base.google.com/ns/1.0, que simplemente añade algo de información adicional al documento XML (descripciones, items, ….) [4].
Cómo ejemplo vamos a manipular un documento para el servicio Google Shopping [3].
<?xml version="1.0"?> <rss version="2.0" xmlns:g="http://base.google.com/ns/1.0"> <channel> <title>El nombre de tu feed de datos</title> <link>http://www.example.com</link> <description>Una descripción de tu contenido</description> <item> <title>Suéter de lana rojo</title> <link> http://www.example.com/página-información-producto1.html</link> <description>Suéter suave y cómodo que te abrigará en las frías noches de invierno</description> <g:image_link>http://www.example.com/imagen1.jpg</g:image_link> <g:price>25</g:price> <g:condition>nuevo</g:condition> <g:id>1a</g:id> </item> </channel> </rss>
Si leyéramos este documento directamente con SimpleXML no entendería los namespaces ni sus elementos, quedan este documento:
<?xml version="1.0"?> <rss version="2.0" xmlns:g="http://base.google.com/ns/1.0"> <channel> <title>El nombre de tu feed de datos</title> <link>http://www.example.com</link> <description>Una descripción de tu contenido</description> <item> <title>Suéter de lana rojo</title> <link> http://www.example.com/página-información-producto1.html</link> <description>Suéter suave y cómodo que te abrigará en las frías noches de invierno</description> </item> </channel> </rss>
¿Cómo solucionarlo? Un ejemplo tonto sería la siguiente función que dado un elemento de un documento XML con SimpleXML busca los elementos del namespace http://base.google.com/ns/1.0. Obtenidos los elementos de este namespace en ese nodo, sólo debemos recoger la propiedad deseada (precio).
function xml_get_price(SimpleXMLElement $item) { $googleSpace = $item->children('http://base.google.com/ns/1.0'); return $googleSpace->price; // para el ejemplo anterior: 25 }
¡Fin! Espero que sea útil.
Referencias
- XML 1.0 (w3c): http://www.w3.org/TR/REC-xml/
- PHP SimpleXML: http://php.net//manual/es/book.simplexml.php
- Google Shopping: https://www.google.es/shopping
- Google Merchants Expecificacion RSS 2.0: https://support.google.com/merchants/answer/160589?hl=es