2015-05-07 3 views
1

Мы можем использовать свойство childNodes и функцию item() для поиска дочернего элемента на основе родительского узла, однако, если путь между родительским и дочерним элементами слишком длинный, может быть слишком много childNodes-> item(), который необходим для записи, например, PHP, перечисленных ниже, я хочу найти содержимое внутри тега P, на основе таблицы узлов, вы можете проверить переменные $ предложения, я не знаю, является ли это единственным способ справиться с такой ситуацией, есть ли лучший способ сделать это?Как найти дочерний элемент на основе определенного узла в PHP?

HTML

<table> 
    <tr> 
     <td> 
      <p>Sentence 1</p> 
     </td> 
    <tr> 
    <tr> 
     <td> 
      <a>Click 1</a> 
     </td> 
    <tr> 
</table> 
<table> 
    <tr> 
     <td> 
      <p>Sentence 2</p> 
     </td> 
    <tr> 
    <tr> 
     <td> 
      <a>Click 2</a> 
     </td> 
    <tr> 
</table> 

Вот мой PHP код

$content = file_get_contents('./a.html'); 
$dom = new \domDocument; 
@$dom->loadHTML($content); 
$dom->preserveWhiteSpace = false; 
$xpath = new \DOMXPath($dom); 

$table_list = $xpath->query('//table'); 
foreach($table_list as $k=>$table_node){ 
    $sentence1 = $table_node->childNodes->item(0)->childNodes->item(0)->childNodes->item(0)->nodeValue; 
} 

Мне нужно получить значение внутри P тега, вы можете увидеть код действительно долго, чтобы просто получить значение внутри P тег, есть ли способ я могу сократить код, например, с помощью

$sentence1 = $table_node->FIND('//tr/td/p') 

Вместо того, чтобы писать childNodes-> пункт () неоднократно?

+0

Запрос xpath позволяет указать узел контекста. например 'foreach ($ xpath-> query ('// table') как $ table) {foreach ($ xpath-> query ('// p', $ table) {...}}', а внутренний запрос будет начните поиск на каждом конкретном '

' узле, а не весь общий документ. –

ответ

0
$content = file_get_contents('./a.html'); 
$dom = new \domDocument; 
@$dom->loadHTML($content); 
$dom->preserveWhiteSpace = false; 
$xpath = new \DOMXPath($dom); 

$table_list = $xpath->query('//table/tr/td/p'); 

$sentences = array(); 
foreach($table_list as $k=>$table_node){ 
    $sentences[] = $table_node->nodeValue; 
} 
0

Если вы меня правильно поняли, вы можете просто сделать это: $xpath->query('/table//p'). Он вернет все элементы p, которые являются прямым или косвенным дочерним элементом элемента таблицы в корне.

Смежные вопросы