Contrairement à la croyance populaire dans les réponses, chaque élément Simplexml nœud peut être retiré du document par elle-même et unset()
. Le point dans le cas est tout simplement que vous avez besoin de comprendre comment SimpleXML fonctionne réellement.
D'abord localiser l'élément que vous voulez supprimer:
list($element) = $doc->xpath('/*/seg[@id="A12"]');
Ensuite, retirer l'élément représenté en $element
vous enlevez son auto-référence:
unset($element[0]);
Cela fonctionne parce que le premier élément d'un élément est l'élément lui-même dans simplexml (auto-référence). Cela a à voir avec la magie de la nature, des indices numériques représentent les éléments dans une liste (par exemple parent->les enfants), et même l'enfant unique est une telle liste.
Non-chaîne numérique indices de représenter les attributs (dans la gamme d'accès) ou de l'enfant-élément(s) (dans la propriété-accès).
Par conséquent numérique indecies dans la propriété-accès comme:
unset($element->{0});
travaillent ainsi.
Naturellement avec xpath exemple, il est plutôt de droite vers l'avant (en PHP 5.4):
unset($doc->xpath('/*/seg[@id="A12"]')[0][0]);
L'exemple complet de code (Démo):
<?php
/**
* Remove a child with a specific attribute, in SimpleXML for PHP
* @link http://stackoverflow.com/a/16062633/367456
*/
$data=<<<DATA
<data>
<seg id="A1"/>
<seg id="A5"/>
<seg id="A12"/>
<seg id="A29"/>
<seg id="A30"/>
</data>
DATA;
$doc = new SimpleXMLElement($data);
unset($doc->xpath('seg[@id="A12"]')[0]->{0});
$doc->asXml('php://output');
Sortie:
<?xml version="1.0"?>
<data>
<seg id="A1"/>
<seg id="A5"/>
<seg id="A29"/>
<seg id="A30"/>
</data>