DOMXpath—获取a元素的href属性和文本值


DOMXpath - Get href attribute and text value of an a element

所以我有一个像这样的HTML字符串:

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

使用XPath,我可以使用这个XPath查询获得href属性的值:

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

获取文本值更容易,像这样:

 // 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) {...}

现在我很想知道,我如何才能组合这两个查询,以获得两个值,只有一个查询(如果它是类似的东西甚至可能?)。

取回

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

,然后取出带有nodeValue的文本和带有getAttribute('href')的属性。

除此之外,您还可以将Xpath查询与联合操作符|结合使用,这样您就可以使用
//td[@class='name']/a/@href|//td[@class='name']

要将代码减少到单个循环,请尝试:

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

最简单的方法,evaluate是为这个任务!

获取值的最简单方法是通过evaluate()方法:

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

注意:重要的是将XPath返回限制为1项(在本例中是第一个a),并且的值转换为string()round(),等等。


那么,在一组多个项目中,使用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);
 }

PS:此示例仅用于evaluate的说明…当节点上已经存在信息时,使用提供最佳性能的方法,如getAttribute()saveXML()等,以及DOMNode提供的属性,如$nodeValue$textContent等。
参见@Gordon对这个问题的回答。
XPath子查询 (at context)适用于复杂情况—或者简化你的代码,避免检查hasChildNodes() +循环来查找$childNodes等等,这样在性能上没有明显的提高。