2011-01-18 5 views
1

明らかにされたHTMLドキュメントのセクションを表すファイル用loadHTMLloadHTMLFileは、各セクションのhtmlbodyタグを埋めるように見えることに表示されたときとI出力、以下:DOMDocumentにHTMLを組み立てるにはどうすればよいですか?

$doc = new DOMDocument(); 
$doc->loadHTMLFile($file); 
$elements = $doc->getElementsByTagName('*'); 

if(!is_null($elements)) { 
    foreach($elements as $element) { 
     echo "<br/>". $element->nodeName. ": "; 

     $nodes = $element->childNodes; 
     foreach($nodes as $node) { 
      echo $node->nodeValue. "\n"; 
     } 
    } 
} 

私が組み立てを計画しているのでこれらの部分を自分のコード内の大きなドキュメントに入れ、DOMDocumentを使用するよう指示されましたが、この動作を防ぐために何ができますか?

答えて

0

最も近い数字はDOMDocumentFragmentです。

次に、あなたが行うことができます:

$doc = new DOMDocument(); 
... 
$f = $doc->createDocumentFragment(); 
$f->appendXML("<foo>text</foo><bar>text2</bar>"); 
$someElement->appendChild($f); 

をしかし、これはXML、HTMLではないと予想しています。

いずれにしても、あなたは人工的な問題を作り出していると思います。 htmlタグとbodyタグを作成する動作が分かっているので、bodyタグからファイル内の要素を抽出してから、最終ファイルをアセンブルするDOMDocumentにインポートすることができます。 DOMDocument::importNodeを参照してください。

1

これは、壊れたHTMLを扱うためにHTML parser module of libxmlが文書に対して行ういくつかの変更の一部です。部分的なマークアップでloadHTMLloadHTMLFileを使用した場合にのみ発生します。パーシャルが有効なX(HT)MLであることがわかっている場合は、代わりにloadloadXMLを使用してください。

あなたは、例えば、body要素のouterHTMLをダンプする

$doc->saveXml($doc->getElementsByTagName('body')->item(0)); 

を使用することができます

<body>anything else</body>とbody要素をstr_replaceで取り除くか、内部HTMLをsubstrで抽出します。これはXHTML準拠したマークアップを使用しますので、<br><br/>なること

$html = '<p>I am a fragment</p>'; 
$dom = new DOMDocument; 
$dom->loadHTML($html); // added html and body tags 
echo substr(
    $dom->saveXml(
     $dom->getElementsByTagName('body')->item(0) 
    ), 
    6, -7 
); 
// <p>I am a fragment</p> 

は注意してください。 PHP 5.3.5以降、ノードをsaveHTML()に渡す方法はありません。 A bug request has been filed.

+0

XMLに保存して効率的に再読み込みしていますか? – Hamster

+0

@ハムスターはどんな点で、あるいは何に比べて?私は、他のファイル操作と同じように/ oのパフォーマンスがあると思います。時間がかかるのは、DOMインスタンスとの間での(デ)直列化です。パフォーマンスに関する懸念がある場合は、ベンチマークを実行することを検討してください。 – Gordon

関連する問題