2012-07-08 179 views
2

我想从特定节点的父项中获取文本。例如:XPath - 使用php xpath从父项中获取文本

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

我能够通过成功处理锚标记:

$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::*'); 

但检索从其他地方错误的数据嵌套上面这段代码。

+0

感谢您的快速响应!假设这个查询是正确的,我将如何实际显示数据(请参阅上面的foreach示例)? $ xNode-> firstChild->数据不工作.. – blearn 2012-07-08 23:01:40

+0

和服是一个真正的酷工具揭露xpath:https://www.kimonolabs.com/ – blearn 2014-05-02 23:14:17

回答

2

这是没有必要撤退回了树。相反,直接选择包含相关元素的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,所以您的实际文档几乎可以肯定包含其他几个元素,包括您可能不想定位的多个其他元素。

示例PHP:

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

最深TD祖先:

//a[@class="info"][@rel="empLinkData"]/ancestor::td[1] 
0

使用

//*[a[@class="info"][@rel="empLinkData"]]/following-sibling::text()[1] 

这将选择单个文本节点 - 这正是想要的一个。

请注意,XPath表达式像

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

选择多个文本节点 - 不仅想要的文本节点。