2

この XML を使用すると、次のようになります。

<my_xml>
  <entities>
    <image url="lalala.com/img.jpg" id="img1" />
    <image url="trololo.com/img.jpg" id="img2" />
  </entities>
</my_xml> 

イメージ タグ内のすべての属性を削除する必要があります。だから、私はこれをやった:

<?php

$article = <<<XML
<my_xml>
  <entities>
    <image url="lalala.com/img.jpg" id="img1" />
    <image url="trololo.com/img.jpg" id="img2" />
  </entities>
</my_xml>  
XML;

$doc = new DOMDocument();
$doc->loadXML($article);
$dom_article = $doc->documentElement;
$entities = $dom_article->getElementsByTagName("entities");

foreach($entities->item(0)->childNodes as $child){ // get the image tags
  foreach($child->attributes as $att){ // get the attributes
    $child->removeAttributeNode($att); //remove the attribute
  }
}

?>

foreach ブロック内の from 属性を削除しようとすると、内部ポインターが失われ、両方の属性が削除されないように見えます。

それを行う別の方法はありますか?

前もって感謝します。

4

1 に答える 1

7

内側のforeachループを次のように変更します。

while ($child->hasAttributes())
  $child->removeAttributeNode($child->attributes->item(0));

または前に戻る削除:

if ($child->hasAttributes()) { 
  for ($i = $child->attributes->length - 1; $i >= 0; --$i)
    $child->removeAttributeNode($child->attributes->item($i));
}

または、属性リストのコピーを作成します。

if ($child->hasAttributes()) {
  foreach (iterator_to_array($child->attributes) as $attr)
    $child->removeAttributeNode($attr);
}

それらのいずれかが機能します。

于 2012-05-16T13:27:22.853 に答える