Created
February 12, 2013 11:23
-
-
Save hakre/4761677 to your computer and use it in GitHub Desktop.
In SimpleXML, how can I add an existing SimpleXMLElement as a child element?
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| <?php | |
| /** | |
| * In SimpleXML, how can I add an existing SimpleXMLElement as a child element? | |
| * | |
| * @link http://stackoverflow.com/q/767327/367456 | |
| * @link http://eval.in/9568 | |
| * @link http://3v4l.org/1sI05 | |
| */ | |
| /** | |
| * Insert XML into a SimpleXMLElement | |
| * | |
| * @param SimpleXMLElement $parent | |
| * @param string $xml | |
| * @param bool $before | |
| * @return bool XML string added | |
| */ | |
| function simplexml_import_xml(SimpleXMLElement $parent, $xml, $before = false) | |
| { | |
| $xml = (string)$xml; | |
| // check if there is something to add | |
| if ($nodata = !strlen($xml) or $parent[0] == NULL) { | |
| return $nodata; | |
| } | |
| // add the XML | |
| $node = dom_import_simplexml($parent); | |
| $fragment = $node->ownerDocument->createDocumentFragment(); | |
| $fragment->appendXML($xml); | |
| if ($before) { | |
| return (bool)$node->parentNode->insertBefore($fragment, $node); | |
| } | |
| return (bool)$node->appendChild($fragment); | |
| } | |
| $parent = new SimpleXMLElement('<parent/>'); | |
| // insert some XML | |
| simplexml_import_xml($parent, "\n <test><this>now</this></test>\n"); | |
| // insert some XML before a certain element, here the first <test> element | |
| // that was just added | |
| simplexml_import_xml($parent->test, "<!-- leave a comment -->\n ", $before = true); | |
| // you can place comments above the root element | |
| simplexml_import_xml($parent, "<!-- this works, too -->", $before = true); | |
| // but take care, you can produce invalid XML, too: | |
| // simplexml_add_xml($parent, "<warn><but>take care!</but> you can produce invalid XML, too</warn>", $before = true); | |
| echo $parent->asXML(), "\n.........................................\n\n"; | |
| $test = simplexml_load_string($parent->asXML()); // validate | |
| /** | |
| * Insert SimpleXMLElement into SimpleXMLElement | |
| * | |
| * @param SimpleXMLElement $parent | |
| * @param SimpleXMLElement $child | |
| * @param bool $before | |
| * @return bool SimpleXMLElement added | |
| */ | |
| function simplexml_import_simplexml(SimpleXMLElement $parent, SimpleXMLElement $child, $before = false) | |
| { | |
| // check if there is something to add | |
| if ($child[0] == NULL) { | |
| return true; | |
| } | |
| // if it is a list of SimpleXMLElements default to the first one | |
| $child = $child[0]; | |
| // insert attribute | |
| if ($child->xpath('.') != array($child)) { | |
| $parent[$child->getName()] = (string)$child; | |
| return true; | |
| } | |
| $xml = $child->asXML(); | |
| // remove the XML declaration on document elements | |
| if ($child->xpath('/*') == array($child)) { | |
| $pos = strpos($xml, "\n"); | |
| $xml = substr($xml, $pos + 1); | |
| } | |
| return simplexml_import_xml($parent, $xml, $before); | |
| } | |
| // append the element itself to itself | |
| simplexml_import_simplexml($parent, $parent); | |
| // insert <this> before the first child element (<test>) | |
| simplexml_import_simplexml($parent->children(), $parent->test->this, true); | |
| // add an attribute to the document element | |
| $test = new SimpleXMLElement('<test attribute="value" />'); | |
| simplexml_import_simplexml($parent, $test->attributes()); | |
| echo $parent->asXML(); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment