Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 18
  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2007
    Messaggi
    398

    SimpleXMLElement dove trovo la definizione della classe ?

    Ciao a tutti altro problemino vorrei fare un estesione della classe SimpleXMLElement utilizzata
    dal modulo simpleXML

    ma non riesco a trovare da nessuna parte la definizione della classe.
    In particolare non so cosa vuole il costruttore non e' documentato da nessuna parte.

    grazie
    Andrea

    p.s. se mi mandate il link del sito php dove spiega i metodi pubblici vi uccido quelli li conosco gia

  2. #2
    Utente di HTML.it
    Registrato dal
    Sep 2007
    Messaggi
    398
    Sempre in relazione al problema di sopra ho fatto qualche prova ho definito la seguente classe

    Codice PHP:
    class ExSimpleXMLElement extends SimpleXMLElement {
        public function 
    __construct($string) {
            
    parent::__construct($string);
            echo 
    "classe estesa di xml simple";

        }

        public function 
    nomenodo() {
            return 
    "nuovo nome nodo : ".$this->getName();
        }

    cosi da questo errore
    Fatal error: Cannot override final method SimpleXMLElement::__construct() in /var/www/prove/classfun.php on line 25

    se tolgo il costruttore mi costruisce bene l'estensione e riesco ad accederci normalmente.

    qualcuno puo chiarirmi questa cosa ?
    secondo quale regola di php si puo imperire alle classi figlie di fare l'overload del padre ?

    ciao

  3. #3
    final

    Ps
    Non ha molto senso estendere SimpleXMLElement
    per far cosa ?

    In caso puoi usare l'aggregation o la composition.



    Without faith, nothing is possible. With it, nothing is impossible
    http://ilwebdifabio.it

  4. #4
    Utente di HTML.it
    Registrato dal
    Sep 2007
    Messaggi
    398
    Grazie ho visto

    e' un po complicato comunque ...

    Ho creato una libreria che gestisce le revisioni di un testo sfruttando come base dati un nodo xml
    fatto cosi
    Codice PHP:
    <main>

    <
    revnode last="2">
    <
    text>testo dell'ultima revisione</text>
    <rev n=0>stringa di diff</rev>
    <rev n=1>stringa di diff</rev>
    <rev n=2>stringa di diff</rev>
    </revnode> 
    ho fatto tutte le funzioni che creano un nodo revisione e lo aggiornano e restituiscono la revisione
    che mi interessa e potrei utilizzare tranquillamente quelle.

    pero ho esteso la libreria con queste funzioni ometto il codice se no diventa un mattone
    Codice PHP:
    class RevsionXmlNode extends SimpleXMLElement 
    {
        public function 
    is_RevNode() {    }
        public function 
    addChildRev($text,$attrlist NULL) {    }
        public function 
    addRevision($text $attrlist NULL) {}
        public function 
    getRevision($nrev_hi = -1,$nrev_low = -1) {}
        public function 
    getRevDiff($nrev_hi = -1,$nrev_low = -1) {}
        public function 
    RevRestore($nrev$attrlist NULL) {}
        public function 
    RevNum() {    }


    in questo modo mi risulta piu facile e immediato da utilizzare come prova ho fatto
    questo

    Codice PHP:


    $xml 
    simplexml_load_string('<base></base>','RevisionXmlNode');
    $revnode $xml->addChildRev("Ecco la mia nuova classe");


    if (
    $xml->revnode->is_revnode()) {echo "E' un nodo di revisioni \n";} else {echo "non e' un nodo di revisioni\n";}
    if (
    $revnode->is_revnode()) {echo "E' un nodo di revisioni \n";} else {echo "non e' un nodo di revisioni\n";}

    echo 
    $revnode->getRevision();

    $lastrev $revnode->addRevision("una seconda versione");
    echo 
    "aggiunta la $lastrev revisione con stringa\n";
    echo 
    $revnode->getRevision(),"\n";

    $lastrev $revnode->addRevision("ciao\ncome stai ?\nio bene e tu ?\n");
    echo 
    "aggiunta la $lastrev revisione con stringa\n";
    echo 
    $revnode->getRevision(),"\n";
    $lastrev $revnode->addRevision("ciao\ncome stai ?\n malissimo");
    echo 
    "aggiunta la $lastrev revisione con stringa\n";
    echo 
    $revnode->getRevision(),"\n";

    echo 
    "torno alla revision 2\n";
    echo 
    $revnode->RevRestore(2),"\n";

    for (
    $i 0$i $revnode->RevNum(); $i ++) {
        echo 
    "\n\n-----------rev $i -----------\n";
        echo 
    $revnode->getRevision($i);


    tieni conto che cosi facendo oltre a gestire i nodi che mi interessano posso accedere all'albero
    xml con tutte le possibila' che offre simpleXML

    come ti sembra ?

    Andrea

  5. #5
    Originariamente inviato da andreamk
    Grazie ho visto

    e' un po complicato comunque ...

    Ho creato una libreria che gestisce le revisioni di un testo sfruttando come base dati un nodo xml
    fatto cosi
    Codice PHP:
    <main>

    <
    revnode last="2">
    <
    text>testo dell'ultima revisione</text>
    <rev n=0>stringa di diff</rev>
    <rev n=1>stringa di diff</rev>
    <rev n=2>stringa di diff</rev>
    </revnode> 
    ho fatto tutte le funzioni che creano un nodo revisione e lo aggiornano e restituiscono la revisione
    che mi interessa e potrei utilizzare tranquillamente quelle.

    pero ho esteso la libreria con queste funzioni ometto il codice se no diventa un mattone
    Codice PHP:
    class RevsionXmlNode extends SimpleXMLElement 
    {
        public function 
    is_RevNode() {    }
        public function 
    addChildRev($text,$attrlist NULL) {    }
        public function 
    addRevision($text $attrlist NULL) {}
        public function 
    getRevision($nrev_hi = -1,$nrev_low = -1) {}
        public function 
    getRevDiff($nrev_hi = -1,$nrev_low = -1) {}
        public function 
    RevRestore($nrev$attrlist NULL) {}
        public function 
    RevNum() {    }


    in questo modo mi risulta piu facile e immediato da utilizzare come prova ho fatto
    questo

    Codice PHP:


    $xml 
    simplexml_load_string('<base></base>','RevisionXmlNode');
    $revnode $xml->addChildRev("Ecco la mia nuova classe");


    if (
    $xml->revnode->is_revnode()) {echo "E' un nodo di revisioni \n";} else {echo "non e' un nodo di revisioni\n";}
    if (
    $revnode->is_revnode()) {echo "E' un nodo di revisioni \n";} else {echo "non e' un nodo di revisioni\n";}

    echo 
    $revnode->getRevision();

    $lastrev $revnode->addRevision("una seconda versione");
    echo 
    "aggiunta la $lastrev revisione con stringa\n";
    echo 
    $revnode->getRevision(),"\n";

    $lastrev $revnode->addRevision("ciao\ncome stai ?\nio bene e tu ?\n");
    echo 
    "aggiunta la $lastrev revisione con stringa\n";
    echo 
    $revnode->getRevision(),"\n";
    $lastrev $revnode->addRevision("ciao\ncome stai ?\n malissimo");
    echo 
    "aggiunta la $lastrev revisione con stringa\n";
    echo 
    $revnode->getRevision(),"\n";

    echo 
    "torno alla revision 2\n";
    echo 
    $revnode->RevRestore(2),"\n";

    for (
    $i 0$i $revnode->RevNum(); $i ++) {
        echo 
    "\n\n-----------rev $i -----------\n";
        echo 
    $revnode->getRevision($i);


    tieni conto che cosi facendo oltre a gestire i nodi che mi interessano posso accedere all'albero
    xml con tutte le possibila' che offre simpleXML

    come ti sembra ?

    Andrea
    Il metodo mi sembra buono anche se a mio parere
    invece di estendere SimpleXMLElement passerei al costruttore
    della tua classe un oggetto SimpleXMLElement.
    Ti consiglio di usare lo stesso metodo con le
    Dom functions e Xpath per gestire stringhe/files
    xml sono di gran lunga le + utilizzate.
    Le Dom functions supportano il DOM secondo il W3C standard.

    Uitlizzizando Xpath rendi lo script/ricerca
    molto + veloce

    Without faith, nothing is possible. With it, nothing is impossible
    http://ilwebdifabio.it

  6. #6
    Il metodo mi sembra buono anche se a mio parere invece di estendere SimpleXMLElement passerei al costruttore della tua classe un oggetto SimpleXMLElement.
    Mi quoto torno sui miei passi

    You may use the optional class_name parameter so that simplexml_load_string() will return an object of the specified class. That class should extend the SimpleXMLElement class.
    Questo non lo sapevo


    Resto sempre della mia idea per le
    Dom ad ogni modo Xpath è supportato
    anche da SimpleXML.
    Without faith, nothing is possible. With it, nothing is impossible
    http://ilwebdifabio.it

  7. #7
    Utente di HTML.it
    Registrato dal
    Sep 2007
    Messaggi
    398
    Si si come vedi nel mio esempio la funzione xml_load_string ha come secondo parametro
    la classe estesa.


    Boh il DOM devo ancora capire bene come e' girato.
    Non e' che lo abbia ancora capito



    ciao

  8. #8
    Utente di HTML.it
    Registrato dal
    Sep 2007
    Messaggi
    398

    Altro problema

    Ho un altro problema questo pero e' piu preoccupante

    se ho un na variabile simpleXML io posso navigare tranquillamente nell'albero
    usando i puntatori.
    Pero modificare gli attributi basta semplicemente assegnare un nuovo valore.

    tipo
    Codice PHP:
    XML
    <main>
    <
    nodo>Ciao</nodo>
    </
    main>

    $xml simplexml_load_string('<main><nodo>Ciao</nodo></main>');

    $echo $xml->nodo ,"\n"//stampa ciao
    $xml->nodo "Hello!";
    $echo $xml->nodo,"\n"//stampa hello! 
    il mio problema e' che se voglio modificare il valore di un nodo il nodo
    cambia da simpleXMLelement a stringa e il problema ancora piu grosso e' che
    se voglio modificare il valore di un nodo che hai dei figli mi cancella i figli

    tipo

    Codice PHP:

    $xml 
    simplexml_load_string('<main><nodo>Ciao<nodofiglio>figlio</nodofiglio></nodo></main>');

    $echo $xml->nodo," ",$xml->nodo->nodofiglio ,"\n"//stampa ciao figlio

    $xml->nodo "Hello!";
    $echo $xml->nodo," ",$xml->nodo->nodofiglio ,"\n"//da errore perche' nodo e' una stringa 
    oltre a questo avrei la necessita' di inserire nodi in testa all'elenco dei figli
    non in conda come fa il metodo addChild();

    una soluzione che ho pensato sarebbe tipo
    Codice PHP:

    $xml
    ->nodo = array ('valore' => "Hello!" $xml->nodo->nodofiglio
    non e' corretta per niente ma l'idea sarebbe quella di assegnare al nodo
    un oggetto ricostruito ma a questo punto non so bene come scriverlo.

    Qualcuno piu praticosa come fare ?

    Andrea

  9. #9
    SimpleXml ha pochi metodi per maneggiare
    un file XML e non ha ad esempio appendChild o ....
    insomma ti servono le dom functions per fare una
    cosa fatta bene.

    Without faith, nothing is possible. With it, nothing is impossible
    http://ilwebdifabio.it

  10. #10
    Bighelonando per la rete ho trovato
    questo articolo che insegna a b c e z
    con le dom functions qui

    bel sitino davvero.

    se cambi idea dacci un occhio
    Without faith, nothing is possible. With it, nothing is impossible
    http://ilwebdifabio.it

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.