Visualizzazione risultati 1 fino 15 di 15

Discussione: Eliminare nodi all'interno di un file xml

  1. #1
    L'avatar di sevenjeak
    sevenjeak non è connesso AlterGuru
    Data registrazione
    25-10-2007
    Residenza
    Roma
    Messaggi
    1,767

    Predefinito Eliminare nodi all'interno di un file xml

    Salve,

    Sto realizzando una chat con PHP e XML, fino ad ora andava tutto bene. il problema e che, in questo codice:
    Codice PHP:
    <?php
    echo "<meta http-equiv='refresh' content='2, message.php' />";

    $file = "database.xml";

    /*$xml = simplexml_load_file($file);
    $count = 0;

    foreach ($xml->input as $in)
    {
    ++$count;
    }

    if ($count >= 10) {

    $dom = new DOMdocument("1.0", "UTF-8");
    $dom->load($file);
    $rt = $dom->documentElement;
    $el = $rt->getElementsByTagName("input");
    foreach ($el as $rm)
    {
    $dato = $rt->getElementsByTagName('input')->item("*");
    $root->removeChild($dato);
    }

    $dom->save($file);
    }*/

    $doc = new DOMdocument("1.0", "UTF-8");
    $doc->load($file);
    $root = $doc->documentElement;
    $elements = $root->getElementsByTagName("input");
    foreach(
    $elements as $out)
    {
    $text = $out->getElementsByTagName("text");
    $text = $text->item(0)->nodeValue;
    echo
    $text . "<br />";
    }
    ?>
    Utilizzato per inviare i messaggi all'archivio, e fino a qui funziona. Il problema è la parte commentata. Nella parte commentata volevo eliminare tutti i nodi, presente nel documento xml, se ci sono dieci o più messaggi, quando viene eseguita la parte di codice mi viene restituito questo errore:

    Fatal error: Call to a member function removeChild() on a non-object in /membri/sevenjeak/mod/message.php on line 23

    Cosa c'è che non va?
    Ultima modifica di sevenjeak : 19-12-2009 alle ore 18.39.37

    Sevenjeak
    Software developer and much more

  2. #2
    Guest

    Predefinito

    La riga interessata è questa:
    Codice PHP:
    $root->removeChild($dato);
    Dove è che valorizzi la variabile $root?

  3. #3
    L'avatar di sevenjeak
    sevenjeak non è connesso AlterGuru
    Data registrazione
    25-10-2007
    Residenza
    Roma
    Messaggi
    1,767

    Predefinito

    Ho modificato il mio script cosi:
    Codice PHP:
    <?php
    echo "<meta http-equiv='refresh' content='2, message.php' />";

    $file = "database.xml";

    $xml = simplexml_load_file($file);
    $count = 0;

    foreach (
    $xml->input as $in)
    {
    ++
    $count;
    }

    if (
    $count >= 10) {

    $dom = new DOMdocument("1.0", "UTF-8");
    $dom->load($file);
    $rt = $dom->documentElement;
    $el = $rt->getElementsByTagName("input");
    foreach (
    $el as $rm)
    {
    $dato = $rm->getElementsByTagName('input')->item("*");
    $rt->removeChild($dato);
    }

    $dom->save($file);
    }

    $doc = new DOMdocument("1.0", "UTF-8");
    $doc->load($file);
    $root = $doc->documentElement;
    $elements = $root->getElementsByTagName("input");
    foreach(
    $elements as $out)
    {
    $text = $out->getElementsByTagName("text");
    $text = $text->item(0)->nodeValue;
    echo
    $text . "<br />";
    }
    ?>
    Mi da lo stesso errore, ha, quasi dimenticavo, il file xml di riferimento è questo:
    Codice:
    <?xml version="1.0" encoding="UTF-8"?>
    <database>
      <input>
         <text>...</text>
      </input>
    </database>
    Io dovrei eliminare tutti i nodi input e i loro contenuti
    Ultima modifica di sevenjeak : 19-12-2009 alle ore 21.15.50

    Sevenjeak
    Software developer and much more

  4. #4
    Guest

    Predefinito

    Prova a vedere, dopo l'assegnazione del valore alla variabile $rt, cosa ti restituisce var_dump($rt).

  5. #5
    L'avatar di sevenjeak
    sevenjeak non è connesso AlterGuru
    Data registrazione
    25-10-2007
    Residenza
    Roma
    Messaggi
    1,767

    Predefinito

    Mi stampa questo:
    Codice:
    object(DOMElement)#2 (0) { }

    Sevenjeak
    Software developer and much more

  6. #6
    L'avatar di mycarlo
    mycarlo non è connesso Utente attivo
    Data registrazione
    06-10-2009
    Residenza
    $this->s50
    Messaggi
    467

    Predefinito

    Codice PHP:
    $dato = $rm->getElementsByTagName('input')->item("*");
    Non credo che quel codice sia corretto...
    Devi fare un altro loop:

    Codice PHP:
    foreach ($el as $rm)
    {
    foreach(
    $rm->getElementsByTagName('input') as $dato)
    {
    $rt->removeChild($dato);
    }
    }

  7. #7
    L'avatar di sevenjeak
    sevenjeak non è connesso AlterGuru
    Data registrazione
    25-10-2007
    Residenza
    Roma
    Messaggi
    1,767

    Predefinito

    Ora lo script non mi restituisce nessun errore e non mi si esegue

    Sevenjeak
    Software developer and much more

  8. #8
    L'avatar di mycarlo
    mycarlo non è connesso Utente attivo
    Data registrazione
    06-10-2009
    Residenza
    $this->s50
    Messaggi
    467

    Predefinito

    Allora prova con un for...

    Codice PHP:
    foreach ($el as $rm)
    {
    $dato = $rm->getElementsByTagName("input");

    for(
    $i = 0; $i <= count($dato) - 1; $i++)
    {
    $rt->removeChild($dato->item($i));
    }
    }
    Anche se alla fine è la stessa cosa

  9. #9
    L'avatar di sevenjeak
    sevenjeak non è connesso AlterGuru
    Data registrazione
    25-10-2007
    Residenza
    Roma
    Messaggi
    1,767

    Predefinito

    La stessa cosa, non funziona

    P.S.: ho provato, con il tuo codice, a stampare la viariabile $dato con la funziona print_r(), non mi restituisce nulla
    Ultima modifica di sevenjeak : 21-12-2009 alle ore 13.43.29

    Sevenjeak
    Software developer and much more

  10. #10
    L'avatar di mycarlo
    mycarlo non è connesso Utente attivo
    Data registrazione
    06-10-2009
    Residenza
    $this->s50
    Messaggi
    467

    Predefinito

    Forse hai sbagliato qualcosa nel codice, perchè se il file xml è:

    Codice:
    <?xml version="1.0" encoding="UTF-8"?>
    <database>
      <input>
         <text>...</text>
      </input>
    </database>
    <input> si trova nella root e quindi il codice dovrebbe essere:

    Codice PHP:
    foreach ($el as $rm)
    {
    $rt->removeChild($rm);
    }

  11. #11
    L'avatar di sevenjeak
    sevenjeak non è connesso AlterGuru
    Data registrazione
    25-10-2007
    Residenza
    Roma
    Messaggi
    1,767

    Predefinito

    ho notato solo ora che funziona solamente quando levo il controllo sulla variabile $count, come mai?
    Ultima modifica di sevenjeak : 21-12-2009 alle ore 14.51.14

    Sevenjeak
    Software developer and much more

  12. #12
    L'avatar di mycarlo
    mycarlo non è connesso Utente attivo
    Data registrazione
    06-10-2009
    Residenza
    $this->s50
    Messaggi
    467

    Predefinito

    Codice PHP:
    if ($count >= 10) {
    Tu dici lì? Molto probabilmente $count sarà minore di 10

  13. #13
    L'avatar di sevenjeak
    sevenjeak non è connesso AlterGuru
    Data registrazione
    25-10-2007
    Residenza
    Roma
    Messaggi
    1,767

    Predefinito

    Ho provato a scrivere la if, sia cosi:
    Codice PHP:
    if ($count == 10)
    che cosi:
    Codice PHP:
    if ($count > 10)
    Ma in entrampi i casi, al posto di eseguirmi la if, mi si ferma l'eseguzione dello script, come posso modificarla?
    Ultima modifica di sevenjeak : 21-12-2009 alle ore 15.19.37

    Sevenjeak
    Software developer and much more

  14. #14
    L'avatar di mycarlo
    mycarlo non è connesso Utente attivo
    Data registrazione
    06-10-2009
    Residenza
    $this->s50
    Messaggi
    467

    Predefinito

    Prima prova a stampare $count, e poi mi sembra sprecato un loop per contare quanti campi input ci siano.
    Basta fare:

    Codice PHP:
    $count = count($xml->input);

    echo
    $count;

    if(
    $count >= 10) {

  15. #15
    L'avatar di sevenjeak
    sevenjeak non è connesso AlterGuru
    Data registrazione
    25-10-2007
    Residenza
    Roma
    Messaggi
    1,767

    Predefinito

    la variabile $count me la stampa, ora i nodi me le elimina solo se sono maggiori di dieci e uno si e uno no, ad esempio, prima dell'esecuzione dello script il mio archivio e cosi: nodo 1, nodo 2, nodo 3, nodo 4, nodo 5, nodo 6, nodo 7, nodo 8 ; dopo l'esecuzione del mio script il mio archivio risulta cosi: nodo 1, nodo 3, nodo 5, nodo 7
    Ultima modifica di sevenjeak : 21-12-2009 alle ore 16.28.48

    Sevenjeak
    Software developer and much more

Regole di scrittura

  • Non puoi creare nuove discussioni
  • Non puoi rispondere ai messaggi
  • Non puoi inserire allegati.
  • Non puoi modificare i tuoi messaggi
  •