PHP + XML: ¿cómo cambiar el nombre y eliminar elementos XML utilizando SimpleXML o DOMDocument?

Tuve cierto éxito gracias a la ayuda de la comunidad StackOverflow para modificar una fuente XML compleja para usar con jsTree. Sin embargo, ahora que tengo datos que se pueden usar, solo es así si edito manualmente el XML para hacer lo siguiente:

  1. Cambiar el nombre de todas tags a
  2. Eliminar algunos elementos antes de la primera etiqueta
  3. inserte una 'encoding=UTF-8' en el abrelatas XML
  4. y finalmente modifique la (apertura de la etiqueta XML) a

Ejemplo de archivo XML: SampleXML

He leído y leído tantas páginas aquí y en google, pero no puedo encontrar un método para lograr los elementos anteriores.

Punto (2) Descubrí que al cargarlo a través de SimpleXML y usar UNSET puedo eliminar las partes que no requiero, sin embargo, sigo teniendo problemas con el rest.

Pensé que quizás podría modificar la fuente con SimpleXML (con el que estoy más familiarizado) y luego continuar modificando el código a través de la ayuda que me habían proporcionado antes.

 row); unset($doc1->display); #$moo = $doc1->user; echo ''; $doc = new DOMDocument(); $doc->loadXML($doc1); $users = $doc->getElementsByTagName("user"); foreach ($users as $user) { if ($user->hasAttributes()) { // create content node $content = $user->appendChild($doc->createElement("content")); // transform attributes into content elements for ($i = 0; $i attributes->length; $i++) { $attr = $user->attributes->item($i); if (strtolower($attr->name) != "id") { if ($user->removeAttribute($attr->name)) { if($attr->name == "username") { $content->appendChild($doc->createElement('name', $attr->value)); } else { $content->appendChild($doc->createElement($attr->name, $attr->value)); } $i--; } } } } } $doc->saveXML(); header("Content-Type: text/xml"); echo $doc->saveXML(); ?> 

Con la recursión, puede crear un nuevo documento basado en la entrada, resolviendo todos sus puntos a la vez:

Código

 < ?php $input = file_get_contents('http://www.fluffyduck.com.au/sampleXML.xml'); $inputDoc = new DOMDocument(); $inputDoc->loadXML($input); $outputDoc = new DOMDocument("1.0", "utf-8"); $outputDoc->appendChild($outputDoc->createElement("root")); function ConvertUserToItem($outputDoc, $inputNode, $outputNode) { if ($inputNode->hasChildNodes()) { foreach ($inputNode->childNodes as $inputChild) { if (strtolower($inputChild->nodeName) == "user") { $outputChild = $outputDoc->createElement("item"); $outputNode->appendChild($outputChild); // read input attributes and convert them to nodes if ($inputChild->hasAttributes()) { $outputContent = $outputDoc->createElement("content"); foreach ($inputChild->attributes as $attribute) { if (strtolower($attribute->name) != "id") { $outputContent->appendChild($outputDoc->createElement($attribute->name, $attribute->value)); } else { $outputChild->setAttribute($attribute->name, $attribute->value); } } $outputChild->appendChild($outputContent); } // recursive call ConvertUserToItem($outputDoc, $inputChild, $outputChild); } } } } ConvertUserToItem($outputDoc, $inputDoc->documentElement, $outputDoc->documentElement); header("Content-Type: text/xml; charset=" . $outputDoc->encoding); echo $outputDoc->saveXML(); ?> 

Salida

 < ?xml version="1.0" encoding="utf-8"?>    bsmain Boss MyTest Test Name lalal@test.com 1964 11/09/2012    underling Under MyTest Test Name lalal@test.com 4 08/09/2009   ...