2011-01-05 8 views
0

私はphp xpathを使って解析しているテーブルの中にいくつかのテーブルを入れ子にしました。php xpath table parsing question

私はいくつかのメソッド呼び出しの間に概念的な単位にコードを分割しているので、この構造はネストしたテーブルを持たない他のシナリオでも完全に動作しています。

// create a host DOM document 
$dom = new DOMDocument(); 

// load the html string into the dom 
$dom->loadHTML($html_string); 

// make an xpath object out of the dom 
$xpath = new DOMXpath($dom); 

// run query to extract the rows from the master table 
$context_nodes = $xpath->query('//table[@id="id1"]/tr[position()>1]'); 

// parse data from the individual tables nested in each master table row 
foreach($context_nodes as $context_node){ 
    $interesting_nodes[] = $xpath->query('table[2]/tr[td[2]]', $context_node); 
} 

たの$ interesting_nodes配列が空DOMNodeListsが含まれています

は、ここでは、コードです。

$ context_nodes DOMNodeListには有効なデータが含まれています。各$のcontext_nodeのHTMLコンテンツは、次のようになります。

$intesting_nodes[] = $xpath->query('table', $context_node); 

しかし、それはまだ同じ空のDOMNodeListsを生成します。

<td> 
    <table></table> 
    <table> 
     <tr> 
      <td></td> 
     </tr> 
     <tr> 
      <td></td> 
      <td></td> 
     </tr> 
    </table> 
</td> 

私は、任意のテーブルに合わせて、以下の単純化の$ intesting_nodesクエリを試してみました。

そして今、興味深い部分

私はそうのような$ interesting_nodesクエリしようとすると:

$interesting_nodes[] = $xpath->query('*[2]/*[*[2]]', $context_node); 

はその後、すべてが完璧にに動作します。 "*"を対応する "table"、 "tr"、または "td"タグに置き換えた場合、クエリは再び壊れます。

他の誰もこの動作とphpの相対xpathクエリの経験がありますか?

私は非常に正確なクエリを使用できるようにしたいと思っており、絶対的なものではなく、相対的なクエリを相対的に保つことができるようにしたいと考えています。

答えて

0

私はそれを理解しました。 :)

php xpathの実装では、マスターテーブルタグが存在しない場合、テーブルの内部ノード(つまり:tr、td)をどうするか分かりません。

外側のtdタグが、xpathクエリから予期しない結果を引き起こしていました。

はに$ context_nodesクエリを変更:

$context_nodes = $xpath->query('//table[@id="id1"]/tr[position()>1]/td'); 

そして、我々は良いです。

+0

を参照してください。 – David

+0

あなたは書いている* php xpathの実装はテーブルの内部ノード*と何をするのか分からない。それは間違っている。 **あなたは 'td'要素に注意を払わなかった人です**。 –

+0

@Alejandroいいえ、それはかなり正しいようですが、「

...
」トップレベルのタグがXMLからはがされているという特定の場合に限ります。元の質問を参照してください。 – David