2011-01-05 14 views
0

Ich habe mehrere Tabellen verschachtelt in einer Tabelle, die ich mit PHP Xpath analysieren.PHP Xpath-Tabelle Parsen Frage

Ich benutze eine Reihe von XPaths, weil ich den Code in konzeptionelle Einheiten über mehrere Methoden Aufrufen, und diese Struktur hat in anderen Szenarien ohne verschachtelte Tabellen perfekt funktioniert.

Hier ist der Code:

// 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); 
} 

Das resultierende $ interesting_nodes Array enthält leere DOMNodeLists.

Die $ context_nodes DOMNodeList enthält gültige Daten. Der HTML-Inhalt jedes $ context_node sieht wie folgt aus:

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

ich die folgende vereinfachte $ intesting_nodes Abfrage versucht, jede Tabelle entsprechen:

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

Aber das erzeugt immer noch die gleichen leeren DOMNodeLists.

Und nun der interessante Teil

Wenn ich versuche, eine Abfrage $ interesting_nodes wie so:

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

Dann funktioniert alles perfekt ; aber wenn ich beliebig "*" durch die entsprechenden "table", "tr" oder "td" Tags ersetze, dann bricht die Abfrage erneut ab.

Hat noch jemand Erfahrung mit diesem Verhalten und relativen XPath-Abfragen in PHP?

Ich würde sehr gerne in der Lage sein, eine genauere Abfrage zu verwenden, und würde lieber in der Lage sein, die Abfrage relativ zu halten, wie es ist, anstatt es absolut zu machen.

Antwort

0

Ich fand es heraus. :)

Die php xpath-Implementierung weiß nicht, was mit internen Tabellenknoten (dh: tr, td) zu tun ist, wenn die Master-Tabellen-Tags nicht vorhanden sind.

Meine äußeren td-Tags verursachten unerwartete Ergebnisse von der Xpath-Abfrage.

die $ context_nodes Abfrage Modifiziert:

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

Und wir sind gut.

+0

Ich mag es nicht, aber es funktioniert. – David

+0

Sie haben geschrieben * Die php xpath-Implementierung weiß nicht, was mit internen Tabellenknoten * zu tun ist. Das ist falsch. ** Sie sind, wer das 'td' Element ** nicht notiert hat. –

+0

@ Alejandro Nein, es scheint ziemlich wahr zu sein, aber nur in dem speziellen Fall, in dem die Top-Level-Tags "

...
" aus dem XML entfernt wurden. Siehe die ursprüngliche Frage. – David