2017-09-27 2 views
2

Plase、help!
必要最初の要素DOMNodeList $myDivsから削除されますが、実際の削除は行われません。要素が残ります。DOMNodeListからDOMElementが削除されていないようです

$dom = new DOMDocument(); 
$dom->loadHTML($file); 
$xpath = new DOMXPath($dom); 
$myDivs = $xpath->query('//div[@data-name|data-price]'); 
usleep(1); 
//Must REVERSE iterate DOMNodeList. 
for ($i = $myDivs->length - 1; $i >= 0; $i--) { 
    //Deleting 1st element of (DOMNodeList) $myDivs, containing advertisement product 
    if ($i == 0) { 
    //Removing div element (DOMNode) from DOM? DOMNodeList? Nothing changes 
    $result = $myDivs->item($i)->parentNode->removeChild($myDivs->item($i)); 
    } 
    //Adding formatted string of attributes of valid DOMElements (div) 
    $outputArr[] = printf('%1$s - %2$s, %3$s.<br>', 
         $myDivs->item($i)->getAttribute('data-name'), 
         $myDivs->item($i)->getAttribute('data-price'), 
         $myDivs->item($i)->getAttribute('data-currency')) 
        ?? null; 
} 

for(){}逆反復する​​て、それはphp.netから思えるよう、XPathと最後の繰り返しで取り込ま($i=0、素子#0)DOMElementのは、どこにでも(DOMとのDOMNodeList)からパージする必要があります。

Keep in mind that DOMNodelists are "live" - changes to the document or node that the DOMNodelist was derived from will be reflected in the DOMNodelist.

You can modify, and even delete, nodes from a DOMNodeList if you iterate backwards

しかしそれは起こらない!

エラーが発生しない、$resultは、私はラインusleep(1);$myDivs->length=31を取得し、ライン$outputArr[] =...で、私はまだ​​の同じ長さを持つデバッグ中

を(removeChild()が、それは正しく仕事です行っているという意味)その正確な要素#0に等しいです。
...

は私が...

P.S.を欠けているものを見ることができないではないはずですしながら、だから、素子#0はまだ、$ouputArrに付加されますもちろん、そのような状況は、常にちょうどcontinueを使用して反復をジャンプすることができますが、を削除すると約はどうですか?

+0

ポジション1のアイテムを2回追加することを賭けます。 –

+0

@PatrickQ、正確ではありません。コードの後半で '$ outputArr'を表示しています。だから、私は要素#0が '$ outputArr'に入ると確信しています。ユニークなコンテンツを持っていますので、間違いありません。 –

答えて

2

あなたは公式文書を引用しているわけではありませんが、ユーザーから寄せられた発言です。 XPathクエリから返されたDOMNodeListsは "生きていません"。 removeChildはDOMNodeListからではなく元の文書からノードを削除します。

+0

さて、はい。公式文書は、_any_ DOMNodeListsを変更することについて言及していません。同様に、DOMDocumentとDOMXPathのDOMNodeListsの相違点についても... XPathクエリの結果DOMNodeListsを編集する方法はありませんか? –

+0

@ Denis.Zはい、DOMNodeLists *を直接変更する方法はありません。元の文書が変更された場合、間接的に変更されるリストもありますが、これは 'DOMNode :: childNodes'によって返されるリストにのみ当てはまります。 – nwellnhof

+0

そう、ありがとう:) –

関連する問題