/** * @param SimpleXMLElement $xml * @param $xpathQuery * @param $value * @param bool $returnAsString * @return object|SimpleXMLElement|string * @throws Exception */ public function setDataByXpath(SimpleXMLElement $xml, $xpathQuery, $value, $returnAsString = false) { if ($value) { if (!$xml) { $xml = simplexml_load_string(Dfi_Xml::from_array(array())); } $elements = $xml->xpath($xpathQuery); if ($elements && count($elements) > 0) { if (count($elements) > 1) { throw new Exception('multiple elements found dont know which update'); } else { $element = $elements[0]; /* @var $element SimpleXMLElement */ $val = (string) $element; if ($value != $val) { dom_import_simplexml($element)->nodeValue = $value; } } } else { $parts = explode('/', $xpathQuery); $last = array_pop($parts); $xml->{$last} = $value; } if ($returnAsString) { return self::checkIsValidXmlStirng($xml->asXML()); } } return $xml; }