gpt4 book ai didi

php - XPath - 使用 php xpath 从父级获取文本

转载 作者:行者123 更新时间:2023-11-28 00:17:24 25 4
gpt4 key购买 nike

我正在尝试从特定节点的父节点获取文本。例如:

<td colspan="1" rowspan="1">
<span>
<a class="info" shape="rect"
rel="empLinkData" href="/employee.htm?id=8468524">
Jack Johnson
</a>
</span>
(*)&nbsp;
</td>

我能够通过以下方式成功处理 anchor 标记:

$xNodes = $xpath->query('//a[@class="info"][@rel="empLinkData"]');

// $xNodes contains employee ids and names
foreach ($xNodes as $xNode)
{
$sLinktext = @$xNode->firstChild->data;
$sLinkurl = 'http://www.company.com' . $xNode->getAttribute('href');

if ($sLinktext != '' && $sLinkurl != '')
{
echo '<li><a href="' . $sLinkurl . '">' .
$sLinktext . '</a></li>';
}
}

现在,我需要从 <td> 中检索文本标记(在本例中,(*)&nbsp; 出现在 span 标记关闭之后),但我似乎无法正确引用它。

对我来说最有意义的 xpath 是:

$xNodes = $xpath->query('//a[@class="info"]
[@rel="empLinkData"]/ancestor::*');

但它正在从嵌套在该代码上方的其他地方检索错误数据。

最佳答案

没有必要退回到树上。相反,直接选择包含相关元素的 td:

//td[descendant::a[@class="info"][@rel="empLinkData"]]/text()

编辑正如@Dimitre 正确指出的那样,这会选择所有文本子项。您的 td 有两个这样的节点:span 之前的纯空白文本节点和它后面的文本节点。如果你只想要第二个文本节点,那么使用:

//td[descendant::a[@class="info"][@rel="empLinkData"]]/text()[2]

或者:

//td[descendant::a[@class="info"][@rel="empLinkData"]]/text()[last()]

如您所见,生成的表达式本质上是相同的,但您确实需要定位正确的文本节点(如果您只需要一个)。另请注意,如果目标文本确实在 td 中,那么直接以该元素类型为目标(不使用通配符)会更安全。由于这是 HTML,您的实际文档几乎肯定包含其他几个元素,包括您可能不想定位的多个其他 anchor 。

示例 PHP:

$nodes = $xpath->query(
'//td[descendant::a[@class="info"][@rel="empLinkData"]]/text()[last()]');
echo "[". $nodes->item(0)->nodeValue . "]";

关于php - XPath - 使用 php xpath 从父级获取文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11387270/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com