我正在尝试从以下HEREDOC中的链接中检索文本。
$html = <<<EOT
<a class="details" href="/link.asp">$2,697.75</a>
<a class="details" href="/link.asp"><s>$150.00</s></a>
<a class="details" href="/link.asp"><font color="red" size="2"><b>Price: $125.00</b></font></a>
EOT;
libxml_use_internal_errors(true);
$dom = new DOMDocument();
$dom->loadhtml($html);
$xpath = new DOMXPath($dom);
$prices_nodeList = $xpath->query('//child::a[@class="details"]');
//$prices_nodeList = $xpath->query('//descendant::a[@class="details"]');
//$prices_nodeList = $xpath->query('//a[@class="details"]/descendant::text()');
foreach ($prices_nodeList as $price) {
$prices[] = $price->nodeValue;
}
echo("<p>prices</p>");
echo("<pre>");
print_r($prices);
echo("</pre>");
?>
分配给$ prices_nodeList的xpath查询
$prices_nodeList = $xpath->query('//child::a[@class="details"]');
似乎可以满足我的要求,但是我认为我不了解它是如何工作的。据我了解,它说“获取类“详细信息”链接的所有直接子元素。”但是,后两个链接中的文字不是直接的孩子,因此我不确定为什么我不必使用
$prices_nodeList = $xpath->query('//descendant::a[@class="details"]');
该值(即$ prices_nodeList的第一个已注释掉的值)也将检索所有三个值。我想知道为什么它们都起作用,以及我的查询是否实际上是执行此操作的最佳方法。相比之下
$prices_nodeList = $xpath->query('//a[@class="details"]/descendant::text()');
也可以,但是
$prices_nodeList = $xpath->query('//a[@class="details"]/child::text()');
仅检索第一个值($ 2,697.75),而不检索后两个值(因为文本包含在元素中)。
最佳答案
据我了解,它说“获取类“详细信息”链接的所有直接子元素。”
不,这意味着获得所有带有当前上下文节点子级“细节”类的链接。
上下文节点是上一步选择的节点。//
是/descandant-or-self::node
的快捷方式。从specification:
//
是/descendant-or-self::node()/
的缩写。例如,//para
是/descendant-or-self::node()/child::para
的缩写,因此将选择文档中的任何para元素(即使是文档元素的para
元素也会被//para
选择,因为文档元素节点是的子元素)根节点); div//para
是div/descendant-or-self::node()/child::para
的缩写,因此将选择para
个子代的所有div
个后代。/descendant-or-self::node()
基本上选择每个节点。因此,查看child
或descendant
轴之间没有区别。
如果链接不是一个节点的子代,则肯定是其后代之一的子代,该子代也由//
选择。
关于php - 为什么'child'和'descendant'在此domdocument()查询中给出相同的结果?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7311851/