2011-11-13 83 views
0

可能重複:
How to insert HTML to PHP DOMNode?
PHP and DOMDocument數組到XML:如何將HTML作爲對象導入到DOMDocument?

我想寫轉換使用DOM文檔數組XML一類 - 以及最重要的是進口HTML到DOM文檔。問題在於HTML未導入到DOM文檔中 - 它以文本字符串的形式導入(例如,HTML標記在結果XML文檔的源中顯示爲&lt;p&gt;而不是<p>)。

更新: 代碼直接添加到這個問題Hakre要求。該代碼有點被黑客攻擊,但工作原理 - 儘管如Hakre所建議的那樣擺脫DomDocument的擴展會很有趣。

class xmlizer extends DomDocument { 

    function __construct() { 
     parent::__construct(); 
    } 

    function node_create($arr, $items = null) { 
     if (is_null($items)) 
      $items = $this->appendChild($this->createElement("items")); 

     // Loop the array values. 
     foreach($arr as $element => $value) { 
      // If Array has numeric keys, use "node - else use $element. 
      $element = is_numeric($element) ? "node" : $element; 
      // Create element, add $value unless $value is an array - and append to main object ($items). 
      $fragment = $this->createElement($element, (is_array($value) ? null : $value)); 
      $items->appendChild($fragment); 

      // Iterate if $value is an array, . 
      if (is_array($value)) { 
       self::node_create($value, $fragment); 
      } 
     } 
    } 

    public function __toString() { 
     // html_entity_decode() added by Micha. Thanks. 
     return html_entity_decode($this->saveXML()); 
    } 

} 

// Build test Array with HTML string (for testing purposes only). 
for($i=0;$i<3;$i++) { 
    $j = $i+1; 
    $array['example'][] = array(
     "id" => $j, 
     "title" => "Title $j", 
     "description" => "<p>Text <strong>string</strong> nr. $j with <em>some</em> <code>HTML code</code>.</p>", 
     ); 
} 


// Test: Run the code. 
header("Content-Type:text/xml"); 
$xml = new xmlizer(); 
$xml->node_create($array); 
echo $xml; 

PS:請不要關閉問題,因爲我不認爲這是重複的。謝謝。

+0

@hakre:建議的解決方案是使用SimpleXML而不是DOM - 我選擇不使用SimpleXML,因爲SimpleXML似乎有問題支持輸出格式和CDATA元素。 –

+1

那麼[SimpleXML和DOMDocument是可以互換的](http://php.net/manual/en/function.dom-import-simplexml.php)(並且鏈接的答案也顯示了我的第一條評論)。關於CDATA你是對的,但也有'LIBXML_NOCDATA'(比較[讀取來自RSS源的cdata](http://stackoverflow.com/questions/8020181/read-cdata-from-a-rss-feed/8020274 #8020274))。並不是說這樣可以解決所有問題,但是您也可以對DOMDocument進行相同的處理,以及Gordon的鏈接。總的來說,如果仔細觀察,所有內容都是指DOMDocument。 – hakre

+0

我試過[戈登的createDocumentFragment()示例](http://stackoverflow.com/questions/4751437/php-dom-append-source-html-to-a-domelement),但無法獲得正確的對象(請參閱[代碼](http://codepad.org/jy31rKAo))。任何幫助將不勝感激。 –

回答

0

嘗試在第二行代碼中的第15行嘗試html_entity_decode($value),但爲什麼要將HTML作爲HTML,因爲它將被解釋爲XML。

更新 對不起上面的一個不工作,這並沒有太多的工作:

$this 
    ->createElement($element) 
    ->createTextNode(is_array($value) ? null : $value)); 

Finaly我tryed它我的自我:

我覺得這是最好的解決方案:http://codepad.org/PpyewkVd

+0

這不會將HTML加載到DOM中 - 請參閱http://codepad.org/Y6VoL2Gy。將XML導入爲XML的原因是使用XSL模板輸出XML(使用當前導入方法HTML編碼保留在XSL模板中)。 ());} –

+0

@KristofferBohmann我看到,但這應該工作'$ this-> createElement($ element) - > createTextNode(is_array($ value)null:$ value));' – noob

+0

不確定你想放置createTextNode() - 我嘗試了[此代碼](http://codepad.org/rCcn7W5X)失敗,並顯示錯誤「調用未定義的方法DOMElement :: createTextNode()」。 –