0

私は理解しようとしている非常に奇妙なバグを持っています。xml を読み込み、特定のノードを見つけて削除し、ファイルを保存します。しかし、私がそれを実行すると、最初の実行でそれらのノードの一部しかキャッチされず、最終的に終了するまで2回目と3回目の実行でさらにいくつかのノードがキャッチされます。なぜこれが起こっているのかを理解できる理由はありません。これが私のコードです:

foreach(glob("*.xml") as $filename) {
$domsrc = file_get_contents($filename, FILE_TEXT);
$MYdom = new DomDocument();
$MYdom->loadXML($domsrc);

foreach ($MYdom->getElementsByTagName('URL') as $virttour) {
    if($virttour->getAttribute('Type') == 'Virtual Tour') {
$virttour->parentNode->removeChild($virttour); 
   }
}
$MYdom->save($filename);
4

2 に答える 2

0

何が原因なのかはまだわかりませんが、別の方法でコードを作り直したところ、1 回の実行ですべてを正しくキャッチできるようになりました。

foreach(glob("*.xml") as $filename) {
$domsrc = file_get_contents($filename, FILE_TEXT);
$MYdom = new DomDocument();
$MYdom->loadXML($domsrc);
$xpath = new DOMXPath($MYdom);
$nodeList = $xpath->query('//URL[@Type="Virtual Tour"]');

foreach ($nodeList as $node){
if ($nodeList->length>0) {
        $node->parentNode->removeChild($node);
    }
}
$MYdom->save($filename);

繰り返しますが、一度に他のコードで動作しなかった理由はわかりませんが、うまくいけば、これがこのようなものに出くわす可能性のある他の誰かを助けるでしょう.

于 2013-09-20T20:11:53.307 に答える
0

最初のコードが機能しない理由は、ノード リストまたは $MYdom->getElementsByTagName('URL') によって作成されたリストが動的であるためです。これは、要素を削除すると、ノードの長さとその位置が変更されることを意味します。foreach ステートメントは、要素の位置が変更されたため、要素をスキップしてしまいます。元のステートメントを実現する最善の方法は、これを考慮した for ステートメントを使用することです。

$nodes = $MYdom->getElementsByTagName('URL')

for ($i = 0; $i < $nodes->length; $i++) {
                  $node = $nodes->item($i);
                  $node->parentNode->removeChild($node);
                  $i--;
                }

または while ステートメント:

while($nodes->length) {
                  $node = $FlavorNodes->item(0);
                  $node->parentNode->removeChild($node);
                }
于 2013-10-08T23:01:38.230 に答える