{"id":228,"date":"2011-11-11T19:42:48","date_gmt":"2011-11-11T18:42:48","guid":{"rendered":"http:\/\/localhost\/blog\/?p=228"},"modified":"2013-03-07T11:51:23","modified_gmt":"2013-03-07T10:51:23","slug":"creazione-dinamica-di-file-xml-con-simplexml","status":"publish","type":"post","link":"https:\/\/www.ilbytecidio.it\/?p=228","title":{"rendered":"Creazione dinamica di file XML con SimpleXML"},"content":{"rendered":"<p>L&#8217;altro giorno <a title=\"Trasferimento di dati con JQuery e JSON\" href=\"http:\/\/www.ilbytecidio.it\/?p=217\">in un articolo nella sezione Javascript<\/a> vi ho parlato dei vantaggi del formato JSON per il trasferimento dei dati. Non ho cambiato idea, ma l&#8217;XML \u00e8 il formato pi\u00f9 utilizzato per lo scambio (e in alcuni casi memorizzazione) dei dati, e lo sar\u00e0 senz&#8217;altro per molto tempo, viste le sue peculiarit\u00e0. Vorrei quindi presentarvi l&#8217;estensione SimpleXML di PHP, che consente di manipolare documenti XML attraverso una loro comoda rappresentazione a oggetti.<!--more--><\/p>\n<p>L&#8217;esempio di utilizzo di questa comoda estensione che vi propongo \u00e8 simile a quello che ho fatto per JSON, tanto che ero piuttosto indeciso su dove pubblicare entrambi gli articoli, ed ecco il compromesso! Naturalmente, l&#8217;uso di SimpleXML non si riduce a quello che vi propongo, ma si presta a innumerevoli altri casi. <a href=\"http:\/\/www.php.net\/manual\/en\/book.simplexml.php\">Qui<\/a> tutta la documentazione che serve. Nella maggior parte dei casi la troveremo gi\u00e0 installata con PHP.<br \/>\nNell&#8217;esempio abbiamo una pagina che legge delle parole memorizzate sul database attraverso AJAX, utilizzando le comode funzioni messe a disposizione da JQuery.<\/p>\n<p>Come al solito, creiamo un database di prova. Il DB &#8220;Test&#8221; a dire il vero normalmente esiste di default, quindi non ci resta che creare la tabella che ci serve.<\/p>\n<pre lang=\"SQL\" line=\"1\">\r\n-- Database: `test`\r\n\r\nCREATE TABLE IF NOT EXISTS `prova` (\r\n  `ID` int(11) NOT NULL,\r\n  `campo1` varchar(255) NOT NULL\r\n);\r\n\r\nINSERT INTO `prova` (`ID`, `campo1`) VALUES\r\n(1, 'hello'),\r\n(2, 'word');\r\n<\/pre>\n<p>Come seconda cosa, creiamo la pagina che far\u00e0 da tramite fra la pagina HTML e il Database. La pagina in questione \u00e8 uno script PHP che legge le parole dal DB e, utilizzando SimpleXML, le restituisce in formato XML.<br \/>\nSe qualcosa non fosse chiaro, vi inviterei ad aprire direttamente col browser la pagina in questione e a vedere il risultato dell&#8217;esecuzione.<\/p>\n<pre lang=\"PHP\" line=\"1\">\r\n<?php\r\n  \/*****************  xml_data.php *******************************\/\r\n\r\n  header('Content-Type: text\/xml');\r\n\r\n  \/* Connessione al database. Sostituisci a HOST, UTENTE e PASSWORD i tuoi dati di accesso a MySQL *\/\r\n  mysql_connect('HOST', 'UTENTE', 'PASSWORD');\r\n  mysql_select_db('test');\r\n\r\n  \/\/Lettura dal database\r\n  $query = 'SELECT * FROM prova';\r\n  $res = mysql_query($query);\r\n  \/\/Conteggio elementi\r\n  $count = mysql_num_rows($res);\r\n\r\n  \/\/Creazione dell'albero XML\r\n  $xml = new SimpleXMLElement('<data><\/data>');\r\n  \/\/Aggiunta dell'attributo count all'elemento radice\r\n  $xml->addAttribute('count', $count);\r\n  \/\/Scorrimento righe lette dal DB\r\n  while($data = mysql_fetch_assoc($res)){\r\n    \/\/Aggiunta di un elemento word come figlio di data\r\n    $child = $xml->addChild('word', $data['campo1']);\r\n    \/\/Attributo ID per l'elemento word\r\n    $child->addAttribute('ID', $data['ID']);\r\n  }\r\n\r\n  \/\/Stampa dei dati XML\r\n  echo $xml->asXML();\r\n?>\r\n<\/pre>\n<p>Come ultima cosa, ecco la pagina HTML che sar\u00e0 aggiornata tramite AJAX scaricando i dati XML restituiti dalla precedente.<\/p>\n<pre lang=\"HTML\" line=\"1\">\r\n<!-- index.html -->\r\n<html>\r\n  <head>\r\n    <title>Parole<\/title>\r\n    <script type=\"text\/javascript\" src=\"http:\/\/ajax.googleapis.com\/ajax\/libs\/jquery\/1.3.2\/jquery.min.js\"><\/script>\r\n  <\/head>\r\n  <body>\r\n    <p>\r\n       <b>Elenco (<span id=\"num\"><\/span> in totale):<\/b>\r\n    <\/p>\r\n    <ul id=\"lista_parole\"><\/ul>\r\n    <script type=\"text\/javascript\">\r\n      $.ajax({\r\n        url : \"xml_data.php\",\r\n        dataType : \"xml\",\r\n        success : function (xml, stat) {\r\n          var data = $(xml).find('data');\r\n          $('#num').html(data.attr('count'));\r\n          data.children('word').each(function(){\r\n            $('<li>' + $(this).text() + ' ' + '(ID: ' + $(this).attr('ID') + ')<\/li>').appendTo('#lista_parole');\r\n          });\r\n        },\r\n        error : function (richiesta, stato, errori) {\r\n          alert(\"Si \u00e8 verificato un errore. Riprova pi\u00f9 tardi\");\r\n        }\r\n      });\r\n    <\/script>\r\n  <\/body>\r\n<\/html>\r\n<\/pre>\n<p>L&#8217;esempio, come al solito, \u00e8 volutamente molto semplice, senza alcuna gestione di errori n\u00e9 altro, perch\u00e9 sia ben comprensibile a tutti. Chiedete pure, se ci sono dubbi!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>L&#8217;altro giorno in un articolo nella sezione Javascript vi ho parlato dei vantaggi del formato JSON per il trasferimento dei dati. Non ho cambiato idea, ma l&#8217;XML \u00e8 il formato pi\u00f9 utilizzato per lo scambio (e in alcuni casi memorizzazione) &hellip; <a href=\"https:\/\/www.ilbytecidio.it\/?p=228\">Continua a leggere<span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[22],"tags":[],"class_list":["post-228","post","type-post","status-publish","format-standard","hentry","category-programmazione-php"],"views":121,"_links":{"self":[{"href":"https:\/\/www.ilbytecidio.it\/index.php?rest_route=\/wp\/v2\/posts\/228","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.ilbytecidio.it\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.ilbytecidio.it\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.ilbytecidio.it\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.ilbytecidio.it\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=228"}],"version-history":[{"count":3,"href":"https:\/\/www.ilbytecidio.it\/index.php?rest_route=\/wp\/v2\/posts\/228\/revisions"}],"predecessor-version":[{"id":446,"href":"https:\/\/www.ilbytecidio.it\/index.php?rest_route=\/wp\/v2\/posts\/228\/revisions\/446"}],"wp:attachment":[{"href":"https:\/\/www.ilbytecidio.it\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=228"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.ilbytecidio.it\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=228"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.ilbytecidio.it\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=228"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}