Author Topic: ( SOLUCIONADO ) Obtener elemento con getElementById de un DOMDocument  (Read 2842 times)

remizero

  • Jr. Member
  • **
  • Posts: 66
  • Karma: 0
    • View Profile
    • Blog personal de programación y linux
Buenas amigos.

En esta oportunidad los vengo a molestar por otro problema que se me ha presentado.

En la misma tónica de mi post anterior, ahora tengo un problema con la búsqueda de elementos en un DOMDocument,
especificamente con la función getElementById del mismo.

El punto es, que estoy creando una página con DOMDocument, en la cual voy insertando etiquetas e información bajo demanda,
pero llega un punto en el que tengo que crear las etiquetas vacías para luego insertar la información, hasta aquí todo muy bien.

El problema se presenta cuando intento acceder a un elemento con la función getElementById la cual no me devuelve absolutamente nada.

Tengo essta función que la que hace este proceso que intento hacer:
Code: [Select]
/**
     * Inserta una cadena o HTML en la etiqueta indicada por su ID.
     *
     * @param cadena $id Identificador de la etiqueta a buscar.
     * @param cadena $contenido Valor que será volcado en la etiqueta buscada.
     */
public function insertar ( $id, $contenido ) {

        $etiqueta = $this->documento->getElementById ( $id );//AQUÍ ESTA EL PROBLEMA, NO DEVUELVE NADA
        //$etiqueta = $this->getElementById ( $id );

/**
* ESTO ES PARA COMPROBAR QUE EN EFECTO CONSIGUE LA ETIQUETA O NO. MI DEBUGGER ;p
*/
        if ( $etiqueta == null ) {
            echo '<script>alert ( "la etiqueta es nula" );</script>';
        }
        if ( $this->esHtml ( $contenido ) ) {

            foreach ( $this->htmlExterno ( $contenido ) as $nodo ) {

                $etiqueta->appendChild ( $this->documento->importNode ( $nodo, true ) );
            }
        } else {

            $etiqueta->appendChild ( new DOMText ( $contenido ) );
        }
    }
   
Este es el error que me arroja (obviamente porque no me devuelve nada):
Code: [Select]
Fatal error: Call to a member function appendChild() on a non-object in $etiqueta->appendChild

En la página de php (http://www.php.net/manual/es/domdocument.getelementbyid.php) me he conseguido con algunas explicaciones de por qué sucede,
pero todo eso lo hago y esta bien, porque la página se genera sin problemas.

Si alguien me puede orientar sobre este problema, le estaré altamente agradecido, pues de esto depende lo que intento hacer.

De antemano muchas gracias por la ayuda, mientras seguiré investigando.
« Last Edit: Octubre 07, 2012, 11:06:22 am by remizero »
Si quieres ver cambios, comienza por cambiar tu primero
http://www.remizero.blogspot.com/
http://www.ecosoftware.com.ve/

remizero

  • Jr. Member
  • **
  • Posts: 66
  • Karma: 0
    • View Profile
    • Blog personal de programación y linux
Re: Obtener elemento con getElementById de un DOMDocument
« Reply #1 on: Abril 02, 2012, 10:31:44 am »
Una duda que me surge de todo esto.

Tengo que cargar el DOMDocument primero para que me pueda funcionar getElementById?

Puedo utilizar el getElementById miestras creo un DOMDocument?, es decir, aun no existe el html en físico.

Pregunto todo esto porque cuando cargo un documento html con DOMDocument::loadHTMLFile si me encuentra el ID, pero cuando estoy creando desde cero el html no me lo encuentra.

Que tengo que hacer para que me pueda encontrar el ID que deseo buscar?

Gracias de antemano.
Si quieres ver cambios, comienza por cambiar tu primero
http://www.remizero.blogspot.com/
http://www.ecosoftware.com.ve/

manix

  • Sr. Member
  • ****
  • Posts: 361
  • Karma: 0
    • View Profile
Re: Obtener elemento con getElementById de un DOMDocument
« Reply #2 on: Abril 27, 2012, 08:17:30 pm »
Hola,

Solo una duda, puedes mostrar como le creas el ID al node?

remizero

  • Jr. Member
  • **
  • Posts: 66
  • Karma: 0
    • View Profile
    • Blog personal de programación y linux
Re: Obtener elemento con getElementById de un DOMDocument
« Reply #3 on: Octubre 07, 2012, 11:05:43 am »
Hola amigos, pido disculpas por revivir este tema, pero me senti en la necesidad de responder y solucionar este problema que tuve hace ya un tiempo.

Hola manix, a tu pregunta, la verdad que es algo complejo mostrarte todo el código pues sería subir muchos archivos y algo tedioso, pero si te puedo decir lo siguiente. Basado en la clase DOMDocument, para crear el ID del node lo hago así:

Code: [Select]
$this->getElemento ()->setAttribute ( $id, $valor );
Donde getElemento (), es un atributo que utilizo para instanciar la clase DOMDocument.

Pero aun así, no me funciona el getElementById del DOMDocument :(.

Lo bueno de todo esto es que conseguí una solucion a todo este problema, aunque algo tarde la respuesta a la solución :S, pero como dice el dicho, más vale tarde que nunca jeje.

Pues bien aquí la explicación que conseguí deducir y la solución:

Como no me gusta que la programación me gane, he encontrado una razón de por qué no puedo hacer lo que requiero.

El problema radica en que al crear un DOMDocument desde cero, este aun no ha validado ni normalizado el documento. Pero por más que intentemos (o por lo menos ya lo he intentado sin frutos), normalizarlo o validarlo con:

Code: [Select]
DOMDocument::validate o
DOMDocument::normalizeDocument

no podremos hacer uso del método DOMDocument::getElementById.

Si bien, podemos como dije en el comentario anterior hacer uso del método DOMDocument::loadHTMLFile, creo que el costo es muy alto cuando se generan XML o HTML muy extensos, por lo que hé conseguido una solución bastante sencilla para solventar este pequeño inconveniente.

La solución no la invente yo, se consigue en la misma pagina de la documentacion oficial de PHP, http://www.php.net/manual/es/domdocument.getelementbyid.php, pero de todas formas aquí se las dejo.

Code: [Select]
function getElementById ( $id, $documento ) {

    $xpath = new DOMXPath ( $documento );
    return $xpath->query ( "//*[@id='$id']" )->item ( 0 );
}

donde $documento, es el DOMDocument que se está generando desde cero.

Espero que les sirva de ayuda para quien tenga el mismo problema.

PD: recalco que esto solo sucede para cuando de esta manipulando un DOMDocument que se está creando desde cero, no cuando se carga un archivo existente.

Espero les sirva y hasta otra oportunidad.
Si quieres ver cambios, comienza por cambiar tu primero
http://www.remizero.blogspot.com/
http://www.ecosoftware.com.ve/

 

ey