Nessun suggerimento sulla scrittura di file xml? in questi giorni ho dato un'occhiata in giro e mi sono accorta che tra DOM e SAX e altro ce n'è di materiale da studiare... Mi pare di aver capito che SAX funziona con PHP 5 e DOM è un'API che deve essere installata sul server, quindi se uso PHP 4 e il server non è il mio non posso usare nessuna delle due, sbaglio?
Il mio metodo, a parte che non funziona, è davvero così sciocco e devo intraprendere altre strade? se si quali? In fondo non è una semplice scrittura su file? se io so che quello che devo scrivere lo devo mettere in testa al file...
In ogni caso per la visualizzazione del contenuto del file xml ho trovato un fantastico script che molto agevolmente mi permette di visualizzare quello che ho sull'XML tramite una serie di funzioni che convertono in array il contenuto dell'XML... Ma se ce l'ho già come array grazie a queste funzioni, non posso manipolarlo come tale?
Per chiunque volesse aiutarmi allego il codice che sto usando, che (ripeto) non è mio. al termine del quale ho l'array $data all'interno del quale trovo gli attributi che mi interessano come
$data[$i][child][$r][dato] che è il corpo della news
$data[$i][child][$r][datas] che è la data della news
il codice è su 2 file:
parserXML.php
Codice PHP:
<?
$struct = array();
# Funzioni di callback
function startElement($parser, $name, $attrs)
{
global $struct;
$tag = array("name"=>$name,"attrs"=>$attrs);
array_push($struct,$tag);
}
function data($parser, $data)
{
global $struct,$i;
if(trim($data)) {
$struct[count($struct)-1]['data']=$data;
}
}
function endElement($parser, $name)
{
global $struct;
$struct[count($struct)-2]['child'][] = $struct[count($struct)-1];
array_pop($struct);
}
# Funzione che parsa il file passatogli nell'argomento e restituisce
# una struttura ad albero oggetti-array contenente il documento
function parse_file($file)
{
global $struct;
$xml_parser = xml_parser_create();
xml_set_element_handler($xml_parser, "startElement", "endElement");
xml_set_character_data_handler($xml_parser, "data");
$parse = xml_parse($xml_parser,file_get_contents($file));
if(!$parse) {
die("XML parsing error");
xml_parser_free($xml_parser);
}
return $struct;
}
?>
news_sys.php
Codice PHP:
<?
include ("parserXML.php");
$fdata = "../public/xmlnews.xml"; # database
$data = parse_file($fdata); # parsa il file-database
if(!isset($_GET['news'])){
$news_for_page="all"; # n. predefinito di news per pagina
}else{
# si puo' decidere di passare allo script
$news_for_page = $_GET['news']; # tramite GET la variabile news col n. di
# news per pagina da visualizzare
}
# il numero totale delle news
$news_num = count($data[0]['child']); # presenti nel database
# Se il n. tot. di news e' minore del numero di news da visualizzare
# Oppure se bisogna visualizzare tutte le news
if ($news_num <= $news_for_page or $news_for_page=="all"){
$offset = 0;
# Memorizza tutte le news
for ($i = $news_num - 1; $i >= 0; $i--){
$date_news[$offset] = $data[0]['child'][$i]['attrs']['DATAS'];
$title_news[$offset] = $data[0]['child'][$i]['attrs']['DATO'];
$data_news[$offset] = $data[0]['child'][$i]['data'];
$offset++;
}
}
# Se il n. tot. di news e' maggiore di quelle da visualizzare
if ($news_num > $news_for_page){
$offset = 0;
# Memorizza solo le ultime '$news_for_page' news
for ($i = $news_num - 1; $i >= $news_num - $news_for_page; $i--){
$date_news[$offset] = $data[0]['child'][$i]['attrs']['DATAS'];
$title_news[$offset] = $data[0]['child'][$i]['attrs']['DATO'];
$data_news[$offset] = $data[0]['child'][$i]['data'];
$offset++;
}
}
?>
Per la visualizzazione
Codice PHP:
<table width="350"><?
# Se il n. tot. di news e' minore del numero di news da visualizzare
# Oppure se bisogna visualizzare tutte le news
if ($news_num <= $news_for_page or $news_for_page=="all"){
$offset=0;
# Visualizza tutte le news
for ($i = $news_num - 1; $i >= 0; $i--){
?>
<tr>
<td align="left">[b]<?=$date_news[$offset]?>[/b]</td>
</tr>
<tr>
<td align="left"><?=$title_news[$offset]?>
</td>
</tr>
<tr>
<td></td>
</tr>
<?
$offset++;
}
}
# Se il n. tot. di news e' maggiore di quelle da visualizzare
if ($news_num > $news_for_page){
$offset = 0;
# Visualizza solo le ultime '$news_for_page' news
for ($i = $news_num - $news_for_page; $i <= $news_num - 1; $i++){
?>
<tr>
<td align="left">[b]<?=$date_news[$offset]?>[/b]</td>
</tr>
<tr>
<td align="left"><?=$title_news[$offset]?>
</td>
</tr>
<?
$offset++;
}
}
?>
</table>
Scusate il post così lungo
Grazie in anticipo
PS mi pare che lo script che cito sia all'interno di un tutorial di Michele Buonaiuto, non ricordo l'indirizzo, ma mi sembra giusto citarlo