如何通过 DOMDocument 获取父元素和嵌套元素?

How to get parent and nested elements by DOMDocument?

在典型的 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 低一级的元素?

有两种方法,第一种是你如何使用 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,它是具有直接后代 <li> 标签的任何 <ol> 标签。

$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>