2

特定のノードの親からテキストを取得しようとしています。例えば:

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

しかし、このコードの上にネストされた他の場所から間違ったデータを取得しています。

4

3 に答える 3

2

木の上に後退する必要はありません。td代わりに、関連する要素を含む を直接選択します。

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

編集: @ Dimitreが正しく指摘したように、これはすべてのテキストの子を選択します。このようなノードtdが 2 つあります。 の前にある空白のみのテキスト ノードspanと、それに続くテキスト ノードです。2 番目のテキスト ノードのみが必要な場合は、次を使用します。

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

または:

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

ご覧のとおり、結果の式は本質的に同じですが、正しいテキスト ノードをターゲットにする必要があります (1 つだけが必要な場合)。また、ターゲット テキストが本当に a の場合は、tdその要素タイプを (ワイルドカードを使用せずに) 直接ターゲットにする方が安全であることにも注意してください。これは HTML であるため、実際のドキュメントには、ターゲットにしたくない他の複数のアンカーを含む、いくつかの他の要素が含まれていることはほぼ確実です。

サンプル PHP:

$nodes = $xpath->query(
    '//td[descendant::a[@class="info"][@rel="empLinkData"]]/text()[last()]');
echo "[". $nodes->item(0)->nodeValue . "]";
于 2012-07-08T22:51:06.033 に答える
0

最も深いtdの祖先:

//a[@class="info"][@rel="empLinkData"]/ancestor::td[1]
于 2012-07-08T22:42:48.453 に答える
0

使用:

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

これにより、1 つのテキスト ノードが選択されます。まさに必要なノードです。

次のような XPath 式に注意してください

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

必要なテキスト ノードだけでなく、複数のテキスト ノードを選択します。

于 2012-07-08T23:52:55.690 に答える