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
Respuesta
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);
¿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
@ user2016290 sí, 'DOMXPath :: query' o incluso' DOMNode :: childNodes'. https://gist.github.com/igstan/9654eca0db804c8e87bd –
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
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.
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.
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;
}
- 1. PHP: DomElement-> getAttribute
- 2. DOMDocument :: saveHTML ($ domnode) en PHP 5.2?
- 3. Determinar el nodo padre de DOMElement
- 4. Creando un DOMDocument desde un DOMNode en PHP
- 5. ¿Cómo obtener innerHTML de DOMNode?
- 6. PHP DOMDocument replace DOMElement child with HTML string
- 7. ¿Cómo agregar html fuente a un elemento DOMElement en PHP?
- 8. ¿Cómo serializar/guardar un elemento DOMElement en $ _SESSION?
- 9. jquery to php translator?
- 10. Javascript: document.createElement ('') y eliminar DOMElement
- 11. php to C# converter
- 12. Convertir SimpleXML en DOMDocument, no DOMElement
- 13. En PHP, ¿cómo puedo obtener el XML externo desde un DOMNode?
- 14. PHP Array to String equivalent
- 15. PHP Timezone Name to Offset
- 16. Push to matriz asociativa en PHP
- 17. Obtenga una etiqueta secundaria específica de un elemento DOMElement en PHP
- 18. PHP DOMNode: cómo extraer no solo texto sino etiquetas HTML también
- 19. PHP: recuperar todos los espacios de nombres declarados de un DOMElement
- 20. php/timeout/connection to server reset?
- 21. php code to test pdo está disponible?
- 22. cálculo de línea rhumb - javascript to php
- 23. Agregue child to xml con PHP simpleXml
- 24. php hash form string to entero
- 25. error "call to undefined function imagecreatetruecolor" en PHP & pChart
- 26. Parse html table using file_get_contents to php array
- 27. PHP ODBC connect() to Access - incompatibilidad de arquitectura
- 28. php string comparasion to 0 integer devuelve true?
- 29. Mail to MySQL Database
- 30. ¿Hay alguna manera de obtener todos los atributos de un DOMElement?
¿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
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
Lo curioso es que getElementById devuelve DOMElement pero getElementsByTagName devuelve una lista donde cada elemento es DOMNode !! – Andrew