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 ..