所以我有一个像这样的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) {...}
现在我很想知道,我怎样才能将这两个查询结合起来,只用一个查询来获取两个值(如果这样的话甚至是可行的?)。
答案 0 :(得分:20)
获取
//td[@class='name']/a
然后使用nodeValue
和getAttribute('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() +循环等,没有明显的性能提升。