2009-06-15 10 views
10

Quiero convertir un objeto DOMNode de una llamada a getElementsByTagName() a un DOMElement para acceder a métodos como getElementsByTagName() en el elemento secundario. En cualquier otro idioma, solía lanzar y sería fácil, pero después de un vistazo rápido, PHP no tiene objeto de fundición. Entonces, lo que necesito saber es cómo obtener un objeto DOMElement desde un objeto DOMNode.DOMNode to DOMElement en php

+0

¿Ha comprobado si getElementsByTagName() realmente devuelve objetos DOMElement con algo como if ($ item instanceof DOMElement)? Si es que no necesita lanzar, puede usar $ item como si fuera un elemento DOMElement – rojoca

+0

getElementsByTagName() devuelve un DOMNodeList, supongo que un DOMNodeList es una lista de DOMNode. La razón por la que pensé que debías lanzar fue porque tuve que lanzar en Java cuando quería hacer el mismo proceso. – Samuel

+1

Lo curioso es que getElementById devuelve DOMElement pero getElementsByTagName devuelve una lista donde cada elemento es DOMNode !! – Andrew

Respuesta

15

No es necesario echar nada, sólo llamar al método:

$links = $dom->getElementsByTagName('a'); 

foreach ($links as $link) { 
    $spans = $link->getElementsByTagName('span'); 
} 

Y, por cierto, DOMElement es una subclase de DOMNode. Si estuviera hablando acerca de un DOMNodeList, a continuación, acceder a los elementos de una lista de este tipo se puede hacer, ser o bien el método presentado anteriormente, con un bucle de foreach(), ya sea utilizando el método item() de DOMNodeList:

$link_0 = $dom->getElementsByTagName('a')->item(0); 
+0

¿Alguna vez DOMNodeList devuelve un DOMNode que no sea un elemento DOME? [The docs] (http://us3.php.net/manual/en/class.domnodelist.php) solo diga DOMNode y no mencione DOMElement. Por ejemplo, ¿qué ocurre si DOMNodeList proviene de [DOMXPath :: query] (http://us2.php.net/manual/en/domxpath.query.php)? – paulie4

+0

@ user2016290 sí, 'DOMXPath :: query' o incluso' DOMNode :: childNodes'. https://gist.github.com/igstan/9654eca0db804c8e87bd –

+0

DOMElement tiene métodos adicionales, que no están disponibles en DOMNode. Por ejemplo getAttribute().Y aunque si usa este método en un DOMNode, funcionará en PHP, no funcionará con su IDE (no disponible en la lista de métodos emergentes). Entonces la pregunta es: cómo obtener DOMElement de getElementsByTagName – Andrew

1

Usted don No es necesario realizar ningún tipo de conversión explícita, simplemente verifique si su objeto DOMNode tiene un nodeType de XML_ELEMENT_NODE.

PHP estará perfectamente satisfecho con esto.

Si usa PHPLint para verificar su código, notará que PHPLint se queja de utilizar getElementsByTagName en un objeto DOMNode. Para evitar esto tiene que saltar a través del siguiente aro:

/*.object.*/ $obj = $node; 
$element = /*.(DOMElement).*/ $obj; 

, entonces tendrá una variable $ elemento del tipo correcto y no hay quejas de PHPLint.

0

Sé que esto es principalmente un problema IDE molesto.

La razón es $DOMNodeList->item(0) que devuelve un DOMNode (o al menos el IDE lo cree).

Para solucionar esto, deberá extraer el $DOMDocument->getElementsByTagName($tagName)->item($index) en un método propio. En el bloqueo DOCB, configura la instrucción @return en DOMElement que soluciona el problema de inspección.

Esto funciona al menos en PHPStorm.

0

Esto es lo que uso en mi proyecto para minimizar la advertencia de IDE.

/** 
* Cast a DOMNode into a DOMElement 
*/ 
    function cast_e(DOMNode $node) : DOMElement { 
    if ($node) { 
     if ($node->nodeType === XML_ELEMENT_NODE) { 
      return $node; 
     } 
    } 
    return null; 
} 
Cuestiones relacionadas