Visualizzazione dei risultati da 1 a 7 su 7
  1. #1

    [PHP DOM] metodo getElementById e validate()

    Ciao,
    ho scoperto che il metodo $doc->getElementById($ID) non funziona su PHP se non dopo aver validato il documento.
    Questa cosa mi stupisce, perché è un metodo basilare per l'identificazione di un oggetto attraverso l'attributo univoco per eccellenza, cioè appunto l'ID.

    Comunque, dovendo piegarci a questa realtà di PHP, provo a validare il documento:

    Codice PHP:

    $doc 
    = new DOMDocument("1.0""UTF-8");

    $doc->loadXML('<books>
        <item>Storie di Nonna Papera</item>
        <item id="pippo" title="click">Il ratto di Topolinia</item>
    </books>'
    );

    if (
    $doc->validate()) { echo "Documento valido!
    "
    ; } else { echo "Non valido!
    "
    ; }

    $a $doc->getElementById("pippo");
    echo 
    $a->getAttribute("title"); 
    Lo script stampa "Non valido", e l'interprete restituisce "No DTD given in XML-Document".
    Ovviamente poi neanche getElementById() restituisce qualcosa.

    Vi chiedo allora: sapete come si dichiara il DTD nel documento DOM per passare questa validazione?
    Emanuele DG
    <?php echo "Proverbio zen(d): vivi ogni giorno come se fosse il ".date('d M Y', time()); ?>
    Intellectual property

  2. #2
    Il DTD serve a specificare la struttura del file XML, ogni possibile combinazione dei tag gli attributi ed il loro posizionamento!

    Devi prima scriverti il DTD, poi legarlo al file XML e quindi usare il metodo validate per la validazione

    Ma la validazione non serve a trovare errori di sintassi trovati dal parser, serve piuttosto a verificare a livello logico c'è un errore nella struttura dei file XML (nell'ordine dei tag, la mancanza/presenza di attributi, e cosi via)
    The fastest Redis alternative ... cachegrand! https://github.com/danielealbano/cachegrand

  3. #3
    Originariamente inviato da daniele_dll
    Il DTD serve a specificare la struttura del file XML, ogni possibile combinazione dei tag gli attributi ed il loro posizionamento!

    Devi prima scriverti il DTD, poi legarlo al file XML e quindi usare il metodo validate per la validazione

    Ma la validazione non serve a trovare errori di sintassi trovati dal parser, serve piuttosto a verificare a livello logico c'è un errore nella struttura dei file XML (nell'ordine dei tag, la mancanza/presenza di attributi, e cosi via)
    Ho capito, infatti ho provato ad inserire un DTD come stringa in un file valido, e ho capito che quella funzione va a leggere le specifiche del DTD sul server W3C e poi valida la correttezza formale del documento... Allucinante, non potrei far aspettare 20 secondi per una funzione da 10 msec! VVoVe:

    In sostanza allora getElementById() è come se non ci fosse, non trovi che sia sconcertante per un modulo DOM??

    Spero almeno che sia in previsione un aggiornamento decente di questo metodo!
    Emanuele DG
    <?php echo "Proverbio zen(d): vivi ogni giorno come se fosse il ".date('d M Y', time()); ?>
    Intellectual property

  4. #4
    Beh, no, dai

    Il fatto è che lui ha bisogno di avere la certezza sintattica perché non è molto flessibile a livello di parsing ... ha bisogno di sapere, tramite il DTD, dove potrebbe trovarsi quell'ID altrimenti deve girarsi tutto l'albero

    Se dai un occhio
    http://usphp.com/manual/en/function....lementbyid.php

    Consigliano di utilizzare XPath per acquisire gli elementi tramite nome tag/id

    Qui c'è un esempio per l'uso di XPath
    http://wiki.flux-cms.org/display/BLO...tById+Pitfalls

    E sempre li c'è spiegato un metodo alternativo all'uso di id, ovvero xml:id evitando l'uso del validate ma sarebbe necessario modificare il file xml
    The fastest Redis alternative ... cachegrand! https://github.com/danielealbano/cachegrand

  5. #5
    Ho letto quelle risorse, sono comunque due possibili soluzioni, grazie.
    Per ora però sto risolvendo in modo più leggero con la semplice funzione che scorre i nodi:

    Codice PHP:

    function getElementById($node$ID) {
        foreach (
    $node->getElementsByTagName("*") as $element) {
            if (
    $element->getAttribute("id") == $ID) { return $element; }
        }
        return 
    null;

    Devo tenermi basso con i tempi di esecuzione, e questa funzione è abbastanza veloce per gli alberi che devo scorrere .
    Mi dispiace solo di non poter inserire tutto nella classe, volevo evitare funzioni esterne per essere un po' più ordinato.

    Stavo pensando se fosse possibile overloadare il metodo getElementById() nella classe DOMdocument... Si può fare?
    Emanuele DG
    <?php echo "Proverbio zen(d): vivi ogni giorno come se fosse il ".date('d M Y', time()); ?>
    Intellectual property

  6. #6
    se la estendi è probabile, ma ti conviene usare XPath perché fa quello che fai tu in modo 100 volte più efficente e se ci sta il dom ci sta anche XPath

    alternativamente perché non usi SimpleXML? C'è solo su php5 ma sarebbe una conveniente alternativa!
    The fastest Redis alternative ... cachegrand! https://github.com/danielealbano/cachegrand

  7. #7
    Originariamente inviato da daniele_dll
    se la estendi è probabile, ma ti conviene usare XPath perché fa quello che fai tu in modo 100 volte più efficente e se ci sta il dom ci sta anche XPath

    alternativamente perché non usi SimpleXML? C'è solo su php5 ma sarebbe una conveniente alternativa!
    Ho dato un'occhiata a XPath.
    Qualcuno consiglia anche questa furbata, dichiarare l'xml:id

    codice:
    // use this:
    $object->setAttribute('xml:id', 'id_name_here')
    // Then, to get the node value:
    $domDocumentObject->getElementById('id_name_here');
    dicendo che poi non si hanno problemi di sorta e il metodo funziona perfettamente.
    Con XPath dovrei usare il metodo query:

    codice:
    $node = XPath->query("//[@id='x']");
    Farò un po' di tracking dei tempi...
    Emanuele DG
    <?php echo "Proverbio zen(d): vivi ogni giorno come se fosse il ".date('d M Y', time()); ?>
    Intellectual property

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.