2017-04-17 4 views
0

は、次のコードを考える:このDOMXpathクエリが兄弟ノードの値をマージする理由を教えてください。

$html = "<h1>foo</h1><h2>bar</h2>"; 
$document = new DOMDocument(); 
$document->loadHTML($html, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD); 
$xpath = new DOMXPath($document); 
$h1Nodes = $xpath->query('//h1'); 
foreach ($h1Nodes as $h1Node) { 
    var_dump($h1Node->nodeValue); 
} 

H1タグは、テキスト 'FOO' でのみテキストノードが含まれています。テキスト 'bar'は兄弟見出しノード(h2)にあります。私は出力が 'foo'になると期待しています。

ただし、出力は 'foobar'です。

なぜですか?

+2

'LIBXML_HTML_NOIMPLIED'は、暗黙のhtml/body ...要素の自動追加を無効にするために使用されます。したがって、 'LIBXML_HTML_NOIMPLIED'を追加する場合、htmlに' 'タグを追加する必要があります。あなたが 'LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD'のように出力されます。 –

答えて

0

ありがとう、ご意見、hardik solankiありがとうございます。

私は答えにつながります。有効なマークアップにはルート要素が必要です。

Markupは私が提供していますが、私が使用したフラグは暗黙的にライブラリを追加しないようにしています。したがって、最初のタグはルート要素として扱われ、その結果はちょっと混乱します。

これらのフラグを削除するとこの問題の解決に役立ちますが、目的に使用しています。私はちょうどHTMLのスニペットを操作したいが、文書全体ではない。私はDOMDocument::saveHTML()と呼んで、このスニペットを元に戻したい(変換後)。 doctype/<html>/<body>タグなし。

私はこれやってしまっている:

  • 私は
  • のDOMDocumentを一時的に有効な文書
  • 負荷それを持ってmanipluateしたいHTMLスニペットにDOCTYPE/<html>/<body>タグを追加それを必要な方法に変換する
  • DOMDocument::saveHTML()
  • 余分なdoctypeを取り除く/ <html>/<body>タグマークアップ

これは機能します。

+1

あなたはDOMがそれ自身をしていることをしています。オプションなしで 'loadHTML()'を使うと、html/bodyタグが追加されます(@hardik solankiのように)。また、HTML要素を保存するための節をHTMLに保存することもできます。 $ HOME = $ document-> saveHtml($ node); ' – ThW

+0

あなたは正しいです。$ foreach($ xpath-> evaluate( 'body/*')ご意見ありがとうございました。 – Luigi

関連する問題