代码之家  ›  专栏  ›  技术社区  ›  Deniss Kozlovs

如何使用php domdocument获取一级节点?

  •  1
  • Deniss Kozlovs  · 技术社区  · 15 年前

    我不熟悉php dom对象,有个问题,找不到解决方案。我有一个带有以下HTML的DOMDocument:

    <div id="header">
    </div>
    <div id="content">
        <div id="sidebar">
        </div>
        <div id="info">
        </div>
    </div>
    <div id="footer">
    </div>
    

    我需要获取第一级的所有节点(页眉、内容、页脚)。HasChildNodes()不起作用,因为第一级节点可能没有子节点(页眉、页脚)。 目前我的代码如下:

    $dom = new DOMDocument();
    $dom -> preserveWhiteSpace = false;
    $dom -> loadHTML($html);
    $childs = $dom -> getElementsByTagName('div');
    

    但这能帮我解决所有的问题。有什么建议吗?

    2 回复  |  直到 15 年前
        1
  •  7
  •   ChronoFish    15 年前

    您可能需要离开domdocument-可能转换为simplexml或domxpath

    $file = $DOCUMENT_ROOT. "test.html";
    $doc = new DOMDocument();
    $doc->loadHTMLFile($file);
    
    $xpath = new DOMXpath($doc);
    $elements = $xpath->query("/");
    
        2
  •  1
  •   Michael Reed    15 年前

    下面是我如何获取第一级元素(在本例中,表行中的顶级td元素:

    $doc = new DOMDocument();
    $doc->preserveWhiteSpace = false;
    $doc->loadHTML( $tr_element );
    
    $xpath = new DOMXPath( $doc );
    $td = $xpath->query("//tr/td[1]")->item(0);
    
    do{
       if( $innerHTML = self::DOMinnerHTML( $td ) )
         array_push( $arr, $innerHTML );
       $td = $td->nextSibling;
    } while( $td != null );
    

    $arr现在包含顶级td元素,但不包含您将从中获得的嵌套表td。

    $dom->getElementsByTagName( 'td' );
    

    DominerHTML函数是我在某个地方找到的,用于获取元素/节点的innerHTML:

    public static function DOMinnerHTML( $element, $deep=true ) 
    { 
      $innerHTML = ""; 
      $children = $element->childNodes; 
      foreach ($children as $child) 
      { 
        $tmp_dom = new DOMDocument(); 
        $tmp_dom->appendChild( $tmp_dom->importNode( $child, $deep ) ); 
        $innerHTML.=trim($tmp_dom->saveHTML()); 
      } 
      return $innerHTML; 
    }
    
    推荐文章