Visualizzazione dei risultati da 1 a 4 su 4

Discussione: php removechild

  1. #1
    Utente di HTML.it L'avatar di kansuke
    Registrato dal
    Apr 2004
    Messaggi
    350

    php removechild

    Mi sto studiando le DOM Functions di PHP.
    Credevo di aver cominciato a capire come funziona la cosa ma mi viene riportato un'errore che non comprendo.

    il mio file xml
    Codice PHP:
    <?xml version="1.0" encoding="UTF-8"?> 
    <root> 
        <elemento id="1">
            <titolo id="15">TITOLO 1</titolo>
            <contenuto id="2">descrizione 1</contenuto>
            <galleria id="3"><img id="4">03155.jpg</img><img id="5">palco2.jpg</img></galleria>     
        </elemento>
        <elemento titolo="titolo 2" id="6">
            <titolo id="16">TITOLO 2</titolo>
            <contenuto id="7">descrizione 2</contenuto>
            <galleria id="8"><img id="9">demolizioni2.jpg</img><img id="10">palco2.jpg</img><img id="11">03155.jpg</img></galleria>     
        </elemento>
        <elemento titolo="titolo 3" id="12">
            <titolo id="17">TITOLO 3</titolo>
            <contenuto id="13">descrizione 3</contenuto>
            <galleria id="14"></galleria>     
        </elemento> 
    </root>

    Lo script php
    Codice PHP:
    Class xmlsource{
        private 
    $xml;
        private 
    $root;
        private 
    $xpath;
        private 
    $doc;
        
        function 
    init($xml){
            
    $this->xml=$xml;
            
    $this->doc = new DOMDocument();
            
    $this->doc->preserveWhiteSpace false;  
            
    $this->doc->load($xml); 
            
    $this->xpath = new DOMXPath($this->doc);
            
    $this->root $this->doc->documentElement;
        }
        function 
    findnodes($query){
            return 
    $this->xpath->query($query);
        }
        function 
    delnodes($query){
            
    $nodes $this->findnodes($query);
            foreach(
    $nodes as $node){
                
    $this->root->removeChild($node); 
            }
            
    file_put_contents($this->xml$this->doc->saveXML());
        }
    }

    $contenuto = new xmlsource();
    $contenuto->init('datip1.xml'); 

    in pratica ho creato un metodo che riceve un xpath ed elimina tutti i nodi che corrispondono.
    numerose prove erano andate a buon fine, poi cambio l'xml con quello che ho indicato, cerco di cancellare tutti i nodi img con:
    $contenuto->delnodes('//img');

    e mi da il seguente errore:
    Fatal error: Uncaught exception 'DOMException' with message 'Not Found Error' in /opt/apache/htdocs/kma/kma-systems/index.php:22 Stack trace: #0 /opt/apache/htdocs/kma/kma-systems/index.php(22): DOMNode->removeChild(Object(DOMElement)) #1 /opt/apache/htdocs/kma/kma-systems/index.php(31): xmlsource->delnodes('//img') #2 {main} thrown in /opt/apache/htdocs/kma/kma-systems/index.php on line 22

    Se tento invece di rimuovere i tag elemento
    $contenuto->delnodes('//elemento');
    va tutto bene e l'operazione va a buon fine
    "Hanno chiuso le mandrie nelle stalle
    perchè liberi siamo fino all'alba."
    R. Kipling

  2. #2
    Codice PHP:
    <?php
    Class xmlsource
        private 
    $xml
        private 
    $root
        private 
    $xpath
        private 
    $doc
         
        function 
    init($xml){ 
            
    $this->xml=$xml
            
    $this->doc = new DOMDocument(); 
            
    $this->doc->preserveWhiteSpace false;   
            
    $this->doc->load($xml); 
            
    $this->xpath = new DOMXPath($this->doc); 
            
    $this->root $this->doc->documentElement
        } 
        function 
    findnodes($query){ 
            return 
    $this->xpath->query($query); 
        } 
        function 
    delnodes($query){ 
               
    $nodes $this->findnodes($query); 
            foreach(
    $nodes as $node){
                
    $parent$node->parentNode;
                
    $parent->removeChild($node);  
            } 
         } 
        function 
    save($fileName){
             
    $this->doc->save($fileName); 
        }

    try{
        
    $contenuto = new xmlsource(); 
        
    $contenuto->init('dati.xml');
        
    $contenuto->delnodes('//img');
        
    $contenuto->save('pippo.xml');
    }
    catch(
    DOMException $e){
        echo 
    $e->getMessage();
    }
    ?>
    DOM_NOT_FOUND Generato se oldnode non è un figlio di questo nodo.

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

  3. #3
    Utente di HTML.it L'avatar di kansuke
    Registrato dal
    Apr 2004
    Messaggi
    350
    la vuoi sapere una cosa da ridere?

    Io avevo interpretato il messaggio in maniera "letterale"....non che l'errore consisteva nel non aver trovato qualche cosa ma che non aveva trovato l'errore!

    Comunque buono a sapersi ti ringrazio molto, questo messaggio comunque non lo avevo trovato nella documentazione.

    Adesso mi riguardo tutto!
    E' bello sapere che la cosa non sta sfociando nel paradossale!
    "Hanno chiuso le mandrie nelle stalle
    perchè liberi siamo fino all'alba."
    R. Kipling

  4. #4
    Utente di HTML.it L'avatar di kansuke
    Registrato dal
    Apr 2004
    Messaggi
    350
    comunque ho risolto immediatamente.

    removechild() effettivamente rimuove solo un'elemento figlio(come dice il nome), non rimuove un discendente!

    Il problema, anche abbastanza banale ad una seconda analisi, è stato aggirato molto semplicemente in questa maniera

    Codice PHP:
    $node->parentNode->removeChild($node); 
    E ora non sembra dare alcun problema.

    grazie mille
    "Hanno chiuso le mandrie nelle stalle
    perchè liberi siamo fino all'alba."
    R. Kipling

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.