2012-01-26 19 views
0

PHP/SimpleXMLで特定のノードを削除する必要がある、かなり複雑なXML文書があります。私は、文書の中でそれらが見つかる深さを確かに知らない。PHP SimpleXMLでXML文書から複数の兄弟ノードを削除する

以下のように動作します。 削除する必要がある要素のIDをユーザーが挿入します。 (これらのIDは、属性を参照してください。)ここでは簡略化された例示的なXMLファイルです:

<?xml version="1.0"?> 
<root> 
    <firstlayer> 
     <secondlayer> 
      <thirdlayer> 
       <element id="1"/> 
       <element id="2"/> 
       <element id="3"/> 
      </thirdlayer> 
      <thirdlayer> 
       <element id="4"/> 
       <element id="5"/> 
      </thirdlayer> 
     </secondlayer> 
    </firstlayer> 
</root> 

要素が、私はそれらを削除する必要がある場合になるだろうされている場合、私は知らないが、私は横断再帰関数を書きましたXML文書:

function traverseNodes($node) { 
    foreach($node->children() as $child) { 
     if($child->getName()=="element") { 
      // Code for finding out if node has to be deleted 
      if(deleteMe) { 
       $dom = dom_import_simplexml($child); 
       $dom->parentNode->removeChild($dom); 
      } else { 
       traverseNodes($child); // visit the children 
      } 
     } 
     else { 
      // do some other stuff with the rest of the nodes 
      // and recursively call the function 
     } 
    } 
} 

この関数は、ルートノードから開始し、すべての子を訪問します。削除しなければならないノードに遭遇すると、それはDOM構造を使ってノードを削除しますが、ここに問題があります。親ノードの最初の兄弟だけを削除します。したがって、前のXML文書から要素1,3、および5を削除する場合は、1と5だけが削除されます(それぞれの親要素で最初に削除されるため、

) foreachループを継続することはできませんので、私はすでに、$の子オブジェクトを破壊について考え、私は本当に感謝されるだろうと二行

$dom = dom_import_simplexml($child); 
$dom->parentNode->removeChild($dom); 

前と後に、それは非常に同じです。問題が何であるかを確認してください任意のアイデアについて...

+0

[XPath](http://www.w3.org/TR/xpath/) – Gordon

答えて

3

XMLが$ xmlStringであると仮定すると、次のようなものを使用できます。

$xml = new SimpleXMLElement($xmlString); 
$ids_to_delete = array(1, 4); 
foreach ($ids_to_delete as $id) { 
    $result = $xml->xpath("//element[@id='$id']"); 
    foreach ($result as $node) { 
     $dom = dom_import_simplexml($node); 
     $dom->parentNode->removeChild($dom); 
    } 
} 
関連する問題