recorrer nodos node leer domelement con complejo php xml dom xml-attribute

nodos - ¿Cómo elimino un nodo específico usando su valor de atributo en PHP XML Dom?



recorrer nodos xml php (4)

¿Desea eliminar el nodo de category con una id específica?

$node = $xmlDoc->getElementById("12345"); if ($node) { $node->parentNode->removeChild($node); }

También puede usar XPath para obtener el nodo, por ejemplo:

$xpath = new DOMXpath($xmlDoc); $nodeList = $xpath->query(''//category[@id="12345"]''); if ($nodeList->length) { $node = $nodeList->item(0); $node->parentNode->removeChild($node); }

No lo he probado, pero debería funcionar.

Mi pregunta es la mejor frase como: Eliminar un niño con un atributo específico, en SimpleXML para PHP

excepto que no estoy usando simpleXML.

Soy nuevo en XML para PHP, así que es posible que no lo esté haciendo de la mejor manera

Tengo un xml creado usando $ dom-> save ($ xml) para cada usuario individual. (no colocando todo en un xml debido a razones no reveladas)

Me da esa declaración xml <?xml version="1.0"?> (Sin idea de cómo llegar a otros, pero ese no es el punto, con suerte)

<?xml version="1.0"?> <details> <person>name</person> <data1>some data</data1> <data2>some data</data2> <data3>some data</data3> <category id="0"> <categoryName>Cat 1</categoryName> <categorydata1>some data</categorydata1> </category> <category id="1"> <categoryName>Cat 2</categoryName> <categorydata1>some data</categorydata1> <categorydata2>some data</categorydata2> <categorydata3>some data</categorydata3> <categorydata4>some data</categorydata4> </category> </details>

Y quiero eliminar una categoría que tiene un atributo específico llamado id con la clase DOM en php cuando ejecuto una función activada desde el uso de un botón eliminar.

Lo siguiente es la depuración de la función que estoy tratando de ponerme a trabajar. ¿Puedo saber lo que estoy haciendo mal?

function CatRemove($myXML){ $xmlDoc = new DOMDocument(); $xmlDoc->load( $myXML ); $categoryArray = array(); $main = $xmlDoc->getElementsByTagName( "details" )->item(0); $mainElement = $xmlDoc->getElementsByTagName( "details" ); foreach($mainElement as $details){ $currentCategory = $details->getElementsByTagName( "category" ); foreach($currentCategory as $category){ $categoryID = $category->getAttribute(''id''); array_push($categoryArray, $categoryID); if($categoryID == $_POST[''categorytoremoveValue'']) { return $categoryArray; } } } $xmlDoc->save( $myXML ); }

Bueno, lo anterior me imprime una matriz de [0] -> 0 todo el tiempo cuando coloco el retorno fuera del if. hay una mejor manera? He intentado usar getElementbyId también, pero no tengo idea de cómo hacerlo.

Preferiría no usar un atributo, aunque eso haría las cosas más fáciles.


¿Puedes probar con esta versión modificada?

function CatRemove($myXML, $id){ $doc = new DOMDocument(); $doc->loadXML($myXML); $xpath = new DOMXpath($doc); $nodeList = $xpath->query("//category[@id=''$id'']"); foreach ($nodeList as $element) { $element->parentNode->removeChild($element); } echo htmlentities($doc->saveXML()); }

Está funcionando para mí. Simplemente adáptelo a sus necesidades. No está destinado a usar tal como está, sino solo una prueba de concepto. También debe eliminar la declaración xml de la cadena.


Ok, probemos este completo ejemplo de uso:

function CatRemove($myXML, $id) { $xmlDoc = new DOMDocument(); $xmlDoc->load($myXML); $xpath = new DOMXpath($xmlDoc); $nodeList = $xpath->query(''//category[@id="''.(int)$id.''"]''); if ($nodeList->length) { $node = $nodeList->item(0); $node->parentNode->removeChild($node); } $xmlDoc->save($myXML); } // test data $xml = <<<XML <?xml version="1.0"?> <details> <person>name</person> <data1>some data</data1> <data2>some data</data2> <data3>some data</data3> <category id="0"> <categoryName>Cat 1</categoryName> <categorydata1>some data</categorydata1> </category> <category id="1"> <categoryName>Cat 2</categoryName> <categorydata1>some data</categorydata1> <categorydata2>some data</categorydata2> <categorydata3>some data</categorydata3> <categorydata4>some data</categorydata4> </category> </details> XML; // write test data into file file_put_contents(''untitled.xml'', $xml); // remove category node with the id=1 CatRemove(''untitled.xml'', 1); // dump file content echo ''<pre>'', htmlspecialchars(file_get_contents(''untitled.xml'')), ''</pre>'';


el funciton anterior modificado para eliminar un correo electrónico de una lista de correo

function CatRemove($myXML, $id) { $xmlDoc = new DOMDocument(); $xmlDoc->load($myXML); $xpath = new DOMXpath($xmlDoc); $nodeList = $xpath->query(''//subscriber[@email="''.$id.''"]''); if ($nodeList->length) { $node = $nodeList->item(0); $node->parentNode->removeChild($node); } $xmlDoc->save($myXML); } $xml = ''list.xml''; $to = $_POST[''email''];//user already submitted they email using a form CatRemove($xml,$to);