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

时间:2019-06-10 18:47:52

标签: php dom domdocument

在典型的HTML中

For

我尝试获取<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下一个层次上?

1 个答案:

答案 0 :(得分:1)

有两种方法,第一种是使用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>