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

时间:2011-07-25 18:10:36

标签: php xpath domxpath

所以我有一个像这样的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) {...}

现在我很想知道,我怎样才能将这两个查询结合起来,只用一个查询来获取两个值(如果这样的话甚至是可行的?)。

3 个答案:

答案 0 :(得分:20)

获取

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

然后使用nodeValuegetAttribute('href')属性来填充文本。

除此之外,您可以将Xpath查询与Union Operator |结合使用,以便您可以使用

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

答案 1 :(得分:14)

要将代码缩减为单个循环,请尝试:

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

如上所述:)太慢..

答案 2 :(得分:4)

最简单的方法,evaluate用于此任务!

获取值的最简单方法是evaluate() method

$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的插图...当节点上已存在信息时,请使用提供最佳效果的内容作为方法{{ 1}},getAttribute()等,以及saveXML()$nodeValue等属性supplied by DOMNode
请参阅@ Gordon关于这个特殊问题的答案。
XPath子查询(在上下文中)适用于复杂情况 - 或者说明您的代码,避免为 $ childNodes检查 hasChildNodes() +循环等,没有明显的性能提升。