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.
Ich mag es nicht, aber es funktioniert. – David
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. –
@ Alejandro Nein, es scheint ziemlich wahr zu sein, aber nur in dem speziellen Fall, in dem die Top-Level-Tags "