Как получить родительские и вложенные элементы по DOMDocument? - PullRequest
0 голосов
/ 10 июня 2019

В типичном HTML как

<ol>
   <li>
      <span>parent</span>
      <ul>
         <li><span>nested 1</span></li>
         <li><span>nested 2</span></li>
      </ul>
   </li>
</ol>

Я пытаюсь получить содержимое <li> элементов, но мне нужно получить parent и вложенные в ul отдельно.

Если перейти как

$ols = $doc->getElementsByTagName('ol');

foreach($ols as $ol){

    $lis = $ol->getElementsByTagName('li');
    // here I need li immediately under <ol>

}

$lis - это все li элементы, включая родительские и вложенные.

Как получить li элементов на один уровень ниже olигнорируя более глубокие уровни?

1 Ответ

1 голос
/ 10 июня 2019

Есть два подхода к этому, первый - как вы работаете с getElementsByTagName(), идея состоит в том, чтобы просто выбрать первый тег <li> и предположить, что он правильный ...

$ols = $doc->getElementsByTagName('ol');

foreach($ols as $ol){
    $lis = $ol->getElementsByTagName('li')[0];
    echo $doc->saveHTML($lis).PHP_EOL;
}

Это отголоски ...

<li>
      <span>parent</span>
      <ul>
<li><span>nested 1</span></li>
         <li><span>nested 2</span></li>
      </ul>
</li>

, который должен работать - НО порой не достаточно точен.

Другим методом будет использование XPath, где вы можете указать уровни тегов документа, которые вы хотите получить. При этом используется //ol/li, т. Е. Любой тег <ol> с непосредственным потомком <li>.

$xp = new DOMXPath($doc);
$lis = $xp->query("//ol/li");

foreach ( $lis as $li ) {
    echo $doc->saveHTML($li);
}

это также дает ...

<li>
      <span>parent</span>
      <ul>
<li><span>nested 1</span></li>
         <li><span>nested 2</span></li>
      </ul>
</li>
...