2012-09-11 74 views
4

我需要將一些任意的HTML加載到現有的DOMDocument樹中。先前的答案建議使用DOMDocumentFragment及其appendXML方法來處理此問題。PHP DOM將DOM附加到現有文檔而不使用DOMDocumentFragment :: appendXML

由於@Owlvark在註釋中指示,xml不是html,因此這不是一個好的解決方案。

我遇到的主要問題是像&ndash這樣的實體導致錯誤,因爲appendXML方法需要格式良好的XML。

我們可以定義這些實體,但是這並不關心並非所有html都是有效的xml的問題。

什麼是將HTML導入DOMDocument樹的好方案?

+1

你可能只需要打開'libxml_use_internal_errors()'和忽略它......此外,你加載使用'的DomDocument :: loadHtml()'權的文件? –

+1

@FrankFarmer,內部錯誤只是從視覺上或從錯誤處理程序中抑制錯誤,它不會真正解決問題。至於'loadHtml',我不是。我正在使用['DOMDocumentFragment :: appendXML'](http://www.php.net/manual/en/domdocumentfragment.appendxml.php) – wmarbut

+1

請參閱[這個答案](http://stackoverflow.com/questions/ 4645738/domdocument-appendxml-with-special-characters) - HTML不是XML – Owlvark

回答

6

我想到的解決方案是使用@FrankFarmer建議的DomDocument::loadHtml,然後將解析的節點導入到我當前的文檔中。我的實現看起來像這樣

/** 
* Parses HTML into DOMElements 
* @param string $html the raw html to transform 
* @param \DOMDocument $doc the document to import the nodes into 
* @return array an array of DOMElements on success or an empty array on failure 
*/ 
protected function htmlToDOM($html, $doc) { 
    $html = '<div id="html-to-dom-input-wrapper">' . $html . '</div>'; 
    $hdoc = DOMDocument::loadHTML($html); 
    $child_array = array(); 
    try { 
     $children = $hdoc->getElementById('html-to-dom-input-wrapper')->childNodes; 
     foreach($children as $child) { 
      $child = $doc->importNode($child, true); 
      array_push($child_array, $child); 
     } 
    } catch (Exception $ex) { 
     error_log($ex->getMessage(), 0); 
    } 
    return $child_array; 
}