So I have a HTML string like this:
Some Name
-
Fetch
//td[@class='name']/a
and then pluck the text with nodeValue
and the attribute with getAttribute('href')
.
Apart from that, you can combine Xpath queries with the Union Operator |
so you can use
//td[@class='name']/a/@href|//td[@class='name']
as well.
讨论(0)
-
Simplest way, evaluate
is for this task!
The simplest way to obtain a value is by evaluate() method:
$xp = new DOMXPath($dom);
$v = $xp->evaluate("string(/etc[1]/@stringValue)");
Note: important to limit XPath returns to 1 item (the first a
in this case), and cast the value with string()
or round()
, etc.
So, in a set of multiple items, using your foreach
code,
$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);
}
PS: this example is only for evaluate
's illustration... When the information already exists at the node, use what offers best performance, as methods getAttribute()
, saveXML()
, etc. and properties as $nodeValue
, $textContent
, etc. supplied by DOMNode.
See @Gordon's answer for this particular problem.
The XPath subquery (at context) is good for complex cases — or symplify your code, avoiding to check hasChildNodes() + loop for $childNodes, etc. with no significative gain in performance.
讨论(0)
-
To reduce the code to a single loop, try:
$anchors = $domXpath->query("//td[@class='name']/a");
foreach($anchors as $a)
{
print $a->nodeValue." - ".$a->getAttribute("href")."<br/>";
}
As per above :) Too slow ..
讨论(0)
- 热议问题