0

XPathを使用してDomの特定の要素にアクセスしようとしています

これが例です

<table>
<tbody>
    <tr>
        <td>
            <b>1</b> <a href="http://www.url.html">data</a><br>
            <b>2</b> <a href="http://www.url.html">data</a><br>
            <b>3</b> <a href="http://www.url.html">data</a><br>
        </td>
    </tr>
</tbody>
</table>

「テーブルtd」をターゲットにしたいので、Xpathでのクエリは次のようになります。

$finder->query('//table/td');

サブ子としてtdを返さないのはこれだけであり、直接アクセスは次を使用して行われます。

$finder->query('//tr/td');

中間の要素を無視して最初の例のようなものを使用し、TDを返すことができるクエリを作成するためのより良い方法はありますか?

4

4 に答える 4

6

中間の要素を無視して最初の例のようなものを使用し、TDを返すことができるクエリを作成するためのより良い方法はありますか?

あなた書くことができます:

//table//td

しかし、これは本当に「より良い」のでしょうか?

多くの場合、XPath疑似演算子 //の評価は、コンテキストノードをルートとするサブツリー全体をトラバースするため、大幅な非効率をもたらす可能性があります。

必要なノードへのパスが静的にわかっている場合は常に、//特定の既知のパスに置き換える方が効率的であるため、完全なサブツリートラバーサルを回避できます。

提供されたXMLドキュメントの場合、そのような式は次のとおりです。

/*/*/tr/td

複数のtable要素があり、それぞれが最上位の要素の子でありtd、forstのsのみを選択する場合table、適切で具体的な式は次のとおりです。

/*/table[1]/*/tr/td

同じドキュメントtdの最初の最初のものだけを選択する場合、tableこれを行うための良い方法は次のとおりです。

(/*/table[1]/*/tr//td)[1]

またはtd、XMLドキュメントの最初のドキュメントを選択する場合(事前にその構造がわからない場合)、次のように指定できます。

(//td)[1]
于 2012-08-20T01:28:02.867 に答える
1

おやおやおやおや、あまり見られないものがあります。
最初のxpathクエリについては、必要なものを返すことができますが、タグ名の前にdouble//を使用します

しかし、タグ名でtdを取得したくない理由がわかりません...

于 2012-08-20T01:11:18.103 に答える
1

あなたが探しているのは:

$finder->query('//table//td');
于 2012-08-20T01:15:30.503 に答える
1

あなたもこのように書くことができます:-

$finder->query('//td');
于 2012-08-20T01:18:32.187 に答える