我正在尝试从以下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//paradiv/descendant-or-self::node()/child::para的缩写,因此将选择para个子代的所有div个后代。


/descendant-or-self::node()基本上选择每个节点。因此,查看childdescendant轴之间没有区别。

如果链接不是一个节点的子代,则肯定是其后代之一的子代,该子代也由//选择。

关于php - 为什么'child'和'descendant'在此domdocument()查询中给出相同的结果?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7311851/

10-13 04:08