php xpath domxpath

php - DOMXpath-Obtener el atributo href y el valor de texto de un elemento a



(3)

La forma más sencilla, evaluate es para esta tarea!

La forma más sencilla de obtener un valor es mediante el método evaluate() :

$xp = new DOMXPath($dom); $v = $xp->evaluate("string(/etc[1]/@stringValue)");

Nota: es importante limitar los retornos de XPath a 1 elemento (el primero a en este caso), y convertir el valor con string() o round() , etc.

Entonces, en un conjunto de elementos múltiples, usando su código foreach ,

$names = $domXpath->query("//td[@class=''name'']/"); foreach($names as $contextNode) { $text = $domXpath->evaluate("string(./a[1])",$contextNode); $href = $domXpath->evaluate("string(./a[1]/@href)",$contextNode); }

PD: este ejemplo es solo para evaluate la ilustración ... Cuando la información ya existe en el nodo, use lo que ofrece el mejor rendimiento , como los métodos getAttribute() , saveXML() , etc. y propiedades como $nodeValue , $textContent , suministrado por DOMNode .
Vea la respuesta de @Gordon para este problema en particular.
La subconsulta XPath (en contexto) es buena para casos complejos, o simplifica su código, evitando verificar hasChildNodes () + loop para $ childNodes , etc. sin un aumento significativo en el rendimiento.

Así que tengo una cadena HTML como esta:

<td class="name"> <a href="/blah/somename23123">Some Name</a> </td> <td class="name"> <a href="/blah/somename28787">Some Name2</a> </td>

Usando XPath puedo obtener el valor del atributo href usando esta consulta Xpath:

$domXpath = new /DOMXPath($this->domPage); $hrefs = $domXpath->query("//td[@class=''name'']/a/@href"); foreach($hrefs as $href) {...}

Y es aún más fácil obtener un valor de texto, como este:

// Xpath auto. strips any html tags so we are // left with clean text value of a element $domXpath = new /DOMXPath($this->domPage); $names = $domXpath->query("//td[@class=''name'']/"); foreach($names as $name) {...}

Ahora tengo curiosidad por saber, ¿cómo puedo combinar esas dos consultas para obtener ambos valores con una sola consulta (si es algo así posible?).


Ha podido recuperar

//td[@class=''name'']/a

y luego desplume el texto con nodeValue y el atributo con getAttribute(''href'') .

Además, puede combinar las consultas de Xpath con el operador de la Unión | para que puedas usar

//td[@class=''name'']/a/@href|//td[@class=''name'']

también.


Para reducir el código a un solo bucle, intente:

$anchors = $domXpath->query("//td[@class=''name'']/a"); foreach($anchors as $a) { print $a->nodeValue." - ".$a->getAttribute("href")."<br/>"; }

Según lo anterior :) Demasiado lento ..