aggiornare valore di un elemento xml con php

simo94n6

Nuovo Utente
5 Ott 2018
10
0
1
esempio di struttura di un file.xml
<libro>
<id>..</id>
<titolo>...</titolo
...
<totvalu>2</totvalu>
<numvalu>1</numvalu>
<valutazione>2</valutazione>
</libro>
vi volevo chiedere come devo procedere per poter aggiornare il file xml dopo che un visitatore nel mio sito attraverso un form php dia una sua valutazione. (in precedenza cancellavo il nodo e lo riscrivevo aggiornato ma non credo sia la soluzione migliore)
 

Max 1

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
29 Feb 2012
4.083
299
83
Ti sposto in PHP
 

Jonn

Utente Attivo
29 Dic 2012
352
3
18
Pistoia
Questo codice aggiorna il valore del tag <valutazione> del file libri.xml basandosi sul solo ID del libro.
Crea una pagina PHP e ci metti dentro:
PHP:
<!DOCTYPE html>
<html>
   <head>
       <title></title>
   </head>
   <body><?php
       /*Conto il numero dei "libri" per impostare il limite di scelta nella form ***ELIMINABILE*** */
       $libri_arr = json_decode(json_encode(simplexml_load_file('libri.xml')),true);
       $max_books_num = count($libri_arr['libro']);echo "\n";?>
       <form method="POST" action=''>
           ID Libro <input type="number" min="1" max="<?php echo $max_books_num; ?>" value="<?php echo $id->nodeValue  ?>" name="id" />
           Valutazione  <input type="number" min="1" max="5" value="<?php echo $valutazione->nodeValue  ?>"  name="valutazione"/>
           <input name="submit" type="submit" value="Aggiorna" />
       </form>
       <?php
           if(file_exists('libri.xml')){
               if(isset($_POST['submit'])){/*Se il pulsante "Modifica è stato premuto:*/
                   /*Recupero i valori della form*/
                   $nuova_valutazione = $_POST["valutazione"];
                   $id_libro = $_POST["id"];
                   $id_vettore = --$id_libro;
                   /*Creo un nuovo documento con tutti i dati di libri.xml*/
                   $xml = new DOMDocument('1.0', 'utf-8');
                   $xml->formatOutput = true;
                   $xml->preserveWhiteSpace = false;
                   $xml->load('libri.xml');
                   //Recupero l'ID del Libro
                   $libro = $xml->getElementsByTagName('libro')->item($id_vettore);
                   //Recupero tutti i nodi dell' ID libro interessato
                   $id = $libro->getElementsByTagName('id')->item(0);
                   $titolo = $libro->getElementsByTagName('titolo')->item(0);
                   $totvalu = $libro->getElementsByTagName('totvalu')->item(0);
                   $numvalu = $libro->getElementsByTagName('numvalu')->item(0);
                   $valutazione = $libro->getElementsByTagName('valutazione')->item(0);
                   //Sovrascrivo il nodo <valutazione> con il nuovo valore
                   $libro->replaceChild($valutazione, $valutazione);
                   $valutazione->nodeValue = $nuova_valutazione;
                   htmlentities($xml->save('libri.xml'));
               }
           }else{echo 'Impossibile aprire libri.xml';}
           /*Stampo il risultato dei libri aggiornato ***ELIMINABILE*** */
           $libri_arr = json_decode(json_encode(simplexml_load_file('libri.xml')),true);
           echo '<pre>'."\n";
           print_r($libri_arr);
           echo "\t\t".'</pre>'."\n";
       ?>
   </body>
</html>
Poi crei il file libri.xml e ci metti dentro come esempio:
Codice:
<?xml version="1.0" encoding="UTF-8"?>
<libri>
  <libro>
    <id>1</id>
    <titolo>Titolo libro 1</titolo>
    <totvalu>1</totvalu>
    <numvalu>2</numvalu>
    <valutazione>3</valutazione>
  </libro>
  <libro>
    <id>2</id>
    <titolo>Titolo libro 2</titolo>
    <totvalu>4</totvalu>
    <numvalu>5</numvalu>
    <valutazione>6</valutazione>
  </libro>
  <libro>
    <id>3</id>
    <titolo>Titolo libro 3</titolo>
    <totvalu>7</totvalu>
    <numvalu>8</numvalu>
    <valutazione>9</valutazione>
  </libro>
  <libro>
    <id>4</id>
    <titolo>Titolo libro 4</titolo>
    <totvalu>10</totvalu>
    <numvalu>11</numvalu>
    <valutazione>12</valutazione>
  </libro>
  <libro>
    <id>5</id>
    <titolo>Titolo libro 5</titolo>
    <totvalu>13</totvalu>
    <numvalu>14</numvalu>
    <valutazione>15</valutazione>
  </libro>
</libri>
 

Jonn

Utente Attivo
29 Dic 2012
352
3
18
Pistoia
Correggendo il file XML nelle varie parti, non può fartelo qualcun altro, lo sai solo tu come deve essere strutturato.
 

simo94n6

Nuovo Utente
5 Ott 2018
10
0
1
Warning: simplexml_load_file(): libri.xml:1: parser error : XML declaration allowed only at the start of the document in .... on line 8

Warning: simplexml_load_file(): <?xml version="1.0" encoding="UTF-8"?> in .... on line 8

Warning: simplexml_load_file(): ^ in .... on line 8
 

Jonn

Utente Attivo
29 Dic 2012
352
3
18
Pistoia
Basta leggere, te lo dice:
XML declaration allowed only at the start of the document == La dichiarazione XML è consentita solo all'inizio del documento.
on line 8 == alla linea 8.
Significa che ha trovato questa dichiarazione alla linea 8 del documento e non all'inizio (oppure duplicata).
PS. controlla anche che non ci siano spazi superflui prima della dichiarazione stessa.