{"id":256,"date":"2014-09-02T16:11:12","date_gmt":"2014-09-02T16:11:12","guid":{"rendered":"https:\/\/blogs.ua.es\/jpm33\/?p=256"},"modified":"2014-09-02T23:19:26","modified_gmt":"2014-09-02T23:19:26","slug":"leer-xml-con-namspaces-facil-en-php","status":"publish","type":"post","link":"https:\/\/blogs.ua.es\/jpm33\/2014\/09\/02\/leer-xml-con-namspaces-facil-en-php\/","title":{"rendered":"Leer XML con namspaces f\u00e1cil en PHP"},"content":{"rendered":"<h1>Introducci\u00f3n<\/h1>\n<p>Cuando manipulamos documentos XML [1] desde PHP [2] uno de los &#8220;quebraderos&#8221; de cabeza son los <strong>namespaces<\/strong>. Un namespace no es nada complicado ni rocambolesco como algunos opinan; no deja de ser un enriquecimiento sem\u00e1ntico para dotar de m\u00e1s informaci\u00f3n a un documento XML.<\/p>\n<p>Tradicionalmente los desarrolaldores PHP no se han complicado con este concepto.\u00a0Pero hoy en d\u00eda con la cantidad de mensajes y documentos XML que env\u00edan mediante REST, SOAP, APIs de terceros, etc. es inevitable y totalmente recomendable conocer como manipularlos de forma sencilla en PHP.<\/p>\n<h1>Caso de uso:\u00a0Google shopping<\/h1>\n<p>Por lo general cualquier documento XML generado por y para Google tendr\u00e1 en namespace <strong>http:\/\/base.google.com\/ns\/1.0<\/strong>, que simplemente a\u00f1ade algo de informaci\u00f3n adicional al documento XML (descripciones, items, &#8230;.) [4].<\/p>\n<p>C\u00f3mo ejemplo vamos a manipular un documento para el servicio Google Shopping [3].<\/p>\n<pre>&lt;?xml version=\"1.0\"?&gt;\r\n\r\n&lt;rss version=\"2.0\" xmlns:g=\"http:\/\/base.google.com\/ns\/1.0\"&gt;\r\n    &lt;channel&gt;\r\n        &lt;title&gt;El nombre de tu feed de datos&lt;\/title&gt;\r\n        &lt;link&gt;http:\/\/www.example.com&lt;\/link&gt;\r\n        &lt;description&gt;Una descripci\u00f3n de tu contenido&lt;\/description&gt;\r\n        &lt;item&gt;\r\n            &lt;title&gt;Su\u00e9ter de lana rojo&lt;\/title&gt;\r\n            &lt;link&gt; http:\/\/www.example.com\/p\u00e1gina-informaci\u00f3n-producto1.html&lt;\/link&gt;\r\n            &lt;description&gt;Su\u00e9ter suave y c\u00f3modo que te abrigar\u00e1 en las fr\u00edas noches de                         \r\n            invierno&lt;\/description&gt;\r\n            &lt;g:image_link&gt;http:\/\/www.example.com\/imagen1.jpg&lt;\/g:image_link&gt;\r\n            &lt;g:price&gt;25&lt;\/g:price&gt;\r\n            &lt;g:condition&gt;nuevo&lt;\/g:condition&gt;\r\n            &lt;g:id&gt;1a&lt;\/g:id&gt;\r\n        &lt;\/item&gt;\r\n    &lt;\/channel&gt;\r\n&lt;\/rss&gt;<\/pre>\n<p>Si ley\u00e9ramos este documento directamente con SimpleXML no entender\u00eda los namespaces ni sus elementos, quedan este documento:<\/p>\n<pre>&lt;?xml version=\"1.0\"?&gt;\r\n\r\n&lt;rss version=\"2.0\" xmlns:g=\"http:\/\/base.google.com\/ns\/1.0\"&gt;\r\n    &lt;channel&gt;\r\n        &lt;title&gt;El nombre de tu feed de datos&lt;\/title&gt;\r\n        &lt;link&gt;http:\/\/www.example.com&lt;\/link&gt;\r\n        &lt;description&gt;Una descripci\u00f3n de tu contenido&lt;\/description&gt;\r\n        &lt;item&gt;\r\n            &lt;title&gt;Su\u00e9ter de lana rojo&lt;\/title&gt;\r\n            &lt;link&gt; http:\/\/www.example.com\/p\u00e1gina-informaci\u00f3n-producto1.html&lt;\/link&gt;\r\n            &lt;description&gt;Su\u00e9ter suave y c\u00f3modo que te abrigar\u00e1 en las fr\u00edas noches de                         \r\n            invierno&lt;\/description&gt;\r\n\r\n        &lt;\/item&gt;\r\n    &lt;\/channel&gt;\r\n&lt;\/rss&gt;<\/pre>\n<p>\u00bfC\u00f3mo solucionarlo? Un ejemplo tonto ser\u00eda la siguiente funci\u00f3n que dado un elemento de un documento XML con SimpleXML busca los elementos del namespace <strong>http:\/\/base.google.com\/ns\/1.0<\/strong>. Obtenidos los elementos de este namespace en ese nodo, s\u00f3lo debemos recoger la propiedad deseada (precio).<\/p>\n<pre>function xml_get_price(SimpleXMLElement $item)\r\n{\r\n    $googleSpace  = $item-&gt;children('http:\/\/base.google.com\/ns\/1.0');\r\n    return $googleSpace-&gt;price; \/\/ para el ejemplo anterior: 25\r\n}<\/pre>\n<p>\u00a1Fin! Espero que sea \u00fatil.<\/p>\n<h1>Referencias<\/h1>\n<ol>\n<li>XML 1.0 (w3c):\u00a0<a href=\"http:\/\/www.w3.org\/TR\/REC-xml\/\">http:\/\/www.w3.org\/TR\/REC-xml\/<\/a><\/li>\n<li>PHP SimpleXML:\u00a0<a href=\"http:\/\/php.net\/\/manual\/es\/book.simplexml.php\">http:\/\/php.net\/\/manual\/es\/book.simplexml.php<\/a><\/li>\n<li>Google Shopping:\u00a0<a href=\"https:\/\/www.google.es\/shopping\">https:\/\/www.google.es\/shopping<\/a><\/li>\n<li>Google Merchants Expecificacion RSS 2.0:\u00a0<a href=\"https:\/\/support.google.com\/merchants\/answer\/160589?hl=es\">https:\/\/support.google.com\/merchants\/answer\/160589?hl=es<\/a><\/li>\n<\/ol>\n","protected":false},"excerpt":{"rendered":"<p>Introducci\u00f3n Cuando manipulamos documentos XML [1] desde PHP [2] uno de los &#8220;quebraderos&#8221; de cabeza son los namespaces. Un namespace no es nada complicado ni rocambolesco como algunos opinan; no deja de ser un enriquecimiento sem\u00e1ntico para dotar de m\u00e1s &hellip; <a href=\"https:\/\/blogs.ua.es\/jpm33\/2014\/09\/02\/leer-xml-con-namspaces-facil-en-php\/\">Continue reading <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":3080,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[374,236731],"tags":[154,841,236718,23],"class_list":["post-256","post","type-post","status-publish","format-standard","hentry","category-programacion","category-web","tag-ingenieria","tag-php","tag-programacion-2","tag-web"],"_links":{"self":[{"href":"https:\/\/blogs.ua.es\/jpm33\/wp-json\/wp\/v2\/posts\/256","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blogs.ua.es\/jpm33\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blogs.ua.es\/jpm33\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blogs.ua.es\/jpm33\/wp-json\/wp\/v2\/users\/3080"}],"replies":[{"embeddable":true,"href":"https:\/\/blogs.ua.es\/jpm33\/wp-json\/wp\/v2\/comments?post=256"}],"version-history":[{"count":5,"href":"https:\/\/blogs.ua.es\/jpm33\/wp-json\/wp\/v2\/posts\/256\/revisions"}],"predecessor-version":[{"id":288,"href":"https:\/\/blogs.ua.es\/jpm33\/wp-json\/wp\/v2\/posts\/256\/revisions\/288"}],"wp:attachment":[{"href":"https:\/\/blogs.ua.es\/jpm33\/wp-json\/wp\/v2\/media?parent=256"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blogs.ua.es\/jpm33\/wp-json\/wp\/v2\/categories?post=256"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blogs.ua.es\/jpm33\/wp-json\/wp\/v2\/tags?post=256"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}