PHP + XML – как переименовать и удалить элементы XML с помощью SimpleXML или DOMDocument?

У меня был некоторый успех из-за помощи сообщества StackOverflow для изменения сложного источника XML для использования с jsTree. Однако теперь, когда у меня есть данные, которые можно использовать, это только так, если я вручную отредактирую XML, чтобы сделать следующее:

  1. Переименуйте теги <user> на <item>
  2. Удалите некоторые элементы перед первым <user>
  3. вставить 'encoding=UTF-8' в открыватель XML
  4. и, наконец, изменить <response> (открытие тега XML) на <root>

Пример XML-файла: SampleXML

Я прочитал и прочитал так много страниц здесь и Google, но не могу найти способ достижения вышеуказанных элементов.

Point (2) Я выяснил, что, загрузив его через SimpleXML и используя UNSET я могу удалить части, которые мне не нужны, однако у меня все еще возникают проблемы с остальными.

Я думал, что могу изменить исходный код с помощью SimpleXML (с которым я больше знаком), а затем продолжить изменение кода с помощью помощи, которую я ранее предоставлял.

 <?php $s = file_get_contents('http://www.fluffyduck.com.au/sampleXML.xml'); $doc1 = simplexml_load_string($s); unset($doc1->row); unset($doc1->display); #$moo = $doc1->user; echo '<textarea>'; echo $doc1->asXML(); echo '</textarea>'; $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 < $user->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(); ?> с <?php $s = file_get_contents('http://www.fluffyduck.com.au/sampleXML.xml'); $doc1 = simplexml_load_string($s); unset($doc1->row); unset($doc1->display); #$moo = $doc1->user; echo '<textarea>'; echo $doc1->asXML(); echo '</textarea>'; $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 < $user->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(); ?> с <?php $s = file_get_contents('http://www.fluffyduck.com.au/sampleXML.xml'); $doc1 = simplexml_load_string($s); unset($doc1->row); unset($doc1->display); #$moo = $doc1->user; echo '<textarea>'; echo $doc1->asXML(); echo '</textarea>'; $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 < $user->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(); ?> 

Используя рекурсию, вы можете создать совершенно новый документ на основе ввода, решая сразу все ваши точки:

Код

 <?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(); ?> 

Вывод

 <?xml version="1.0" encoding="utf-8"?> <root> <item id="41"> <content> <username>bsmain</username> <firstname>Boss</firstname> <lastname>MyTest</lastname> <fullname>Test Name</fullname> <email>lalal@test.com</email> <logins>1964</logins> <lastseen>11/09/2012</lastseen> </content> <item id="61"> <content> <username>underling</username> <firstname>Under</firstname> <lastname>MyTest</lastname> <fullname>Test Name</fullname> <email>lalal@test.com</email> <logins>4</logins> <lastseen>08/09/2009</lastseen> </content> </item> ...