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