У меня был некоторый успех из-за помощи сообщества StackOverflow для изменения сложного источника XML для использования с jsTree. Однако теперь, когда у меня есть данные, которые можно использовать, это только так, если я вручную отредактирую XML, чтобы сделать следующее:
<user>
на <item>
<user>
'encoding=UTF-8'
в открыватель XML <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> ...