tag node name example domnodelist domelement php dom xpath domdocument

node - php domelement to string



Cómo ver los datos del objeto DOMNodeList en php (9)

¿Qué tal una función recursiva?

Function XMLPrint_r($d_DomNode) { print $d_DomNode->$nodeName." ".$d_DomNode->$nodeValue."<br>"; Foreach($d_DomNode->$childNodes as $d_ChildNode) { print " "; XMLPrint_r($d_ChildNode); } }

No probé esto, pero entiendes la idea.

cuando quiero probar php array uso el siguiente código

print_r($myarray);

pero sé que quiero ver los datos de un objeto, mi objeto es

$xpath = new DOMXPath($doc); $myobject = $xpath->query(''//*[ancestor-or-self::a]'');

cuando uso

print_r($myobject);

Obtengo esa salida

DOMNodeList Object ( )

Quiero iterar a través de los valores de este objeto para probar el resultado de mi consulta?


Su consulta xpath no coincide con nada en su XML.

Desde la página del manual de consulta de DomXPath ::

Devuelve un DOMNodeList que contiene todos los nodos que coinciden con la expresión XPath dada. Cualquier expresión que no devuelva nodos devolverá un DOMNodeList vacío.


var_dump($myobject); puede ser lo que estás buscando


DOMNodeList es un objeto interesante, uno del que no obtendrá mucha información al usar print_r o var_dump .

Hay muchas formas de ver los datos de un objeto DOMNodeList. Aquí hay un ejemplo:

$xpath = new DOMXpath($dom); $dom_node_list = $xpath->query($your_xpath_query); $temp_dom = new DOMDocument(); foreach($dom_node_list as $n) $temp_dom->appendChild($temp_dom->importNode($n,true)); print_r($temp_dom->saveHTML());

(Por supuesto, use saveXML en lugar de saveHTML si está tratando con XML.)

Una DOMNodeList se puede iterar como una matriz. Si desea extraer los datos del objeto DOMNodeList y colocarlos en una estructura de datos diferente, como una matriz o un objeto stdClass, simplemente itere a través de los "nodos" en la DOMNodeList, convirtiendo los valores de los nodos y / o atributos (que desea tener disponibles) antes de agregarlos a la nueva estructura de datos.



Por alguna razón, no he podido hacer que los métodos saveHTML / saveXML funcionen. Así que escribí mi propia rutina recursiva que funciona para mí:

function pvIndent ( $ind ) { for ($i=0;$i<$ind;$i++) print ( " " ); } function pvPrint_r ( $val ) { echo ''<pre>''; print_r ( $val ); echo ''</pre>''; } function pvDOMNodeListPrint_r_ ( $ind,$DOMNodeList ) { for ($item=0;$item<$DOMNodeList->length;$item++) { $DOMNode = $DOMNodeList->item($item); if ($DOMNode->nodeName != "#text") { pvIndent ( $ind ); print $DOMNode->nodeName; if ($DOMNode->nodeValue) print " = " . trim($DOMNode->nodeValue); print "/n"; if ($DOMNode->attributes) for ($attr=0;$attr<$DOMNode->attributes->length;$attr++) { $DOMNodeAttr = $DOMNode->attributes->item($attr); pvIndent ( $ind+1 ); print "@" . $DOMNodeAttr->nodeName . " = " . trim($DOMNodeAttr->nodeValue) . "/n"; } if ($DOMNode->childNodes) pvDOMNodeListPrint_r_ ( $ind+1,$DOMNode->childNodes ); } } } function pvDOMNodeListPrint_r ( $DOMNodeList ) { echo ''<pre>''; pvDOMNodeListPrint_r_ ( 0,$DOMNodeList ); echo ''</pre>''; }

Llame a pvDOMNodeListPrint_r con su resultado de una consulta en un objeto XDOMPath.

Notas:

pv es solo el prefijo que utilizo para evitar la contaminación del espacio de nombres. No dude en editarlo.

se usan etiquetas pre para que el espacio en blanco y las líneas nuevas se manejen correctamente para el formateo cuando salen en el cuerpo de su html, que es donde generalmente necesito tales declaraciones de depuración: puede formatear a su gusto.

He omitido DOMNode explícitamente con el nombre "#text" ya que parece que repiten el texto que ya estaba en el nodo principal. No estoy seguro de que sea correcto para todos los XDOMPath válidos cargados con HTML, pero aún no he visto una excepción: siempre puedes eliminar la exclusión si no te importa la redundancia habitual.


Después de mucha depuración descubrí que todos los objetos DOM son invisibles para var_dump () y print_r (), supongo que es porque son objetos C y no objetos PHP. Así que probé guardarXML (), que funciona bien en DOMDocument, pero no está implementado en DOMElement.

La solución es simple (si lo sabes):

$xml = $domElement->ownerDocument->saveXML($domElement);


Es posible navegar a través de los nodos usando un foreach simple de la siguiente manera:

foreach ($myobject as $node) { echo $node->nodeValue, PHP_EOL; } // end foreach

Espero que pueda ayudar a los demás, las piezas importantes de código son

foreach

y el artículo

$node->nodeValue

Para más detalles sobre esta clase, visite:

http://php.net/manual/en/class.domnodelist.php


Un poco tarde en el juego, pero tal vez ayuda a alguien ...

Tenga en cuenta la salida de utf-8 cuando use el objeto dom / xpath en sí.

Si imprimiera directamente nodeValue, obtendría caracteres dañados, por ejemplo:

ìÂÂì ë¹Â디ì¤ ìì ë¹ë””ì¤ í°ì íì¤

Tienes que cargar tu objeto dom con el segundo param "utf-8", new /DomDocument(''1.0'', ''utf-8'') , pero aún cuando imprimes el valor de la lista de nodos / elementos del dom, obtienes caracteres rotos:

echo $contentItem->item($index)->nodeValue

tienes que concluir con utf8_decode:

echo utf8_decode($contentItem->item($index)->nodeValue) //output: 者不終朝而會,愚者可浹旬而學