public static function fromXml($value) { if (!$value instanceof SimpleXMLElement) { try { /** Ugly hack to ignore parse errors */ $value = @new SimpleXMLElement($value); } catch (Exception $e) { require_once 'Zend/Service/SecondLife/Value/Exception.php'; throw new Zend_Service_SecondLife_Value_Exception('Could not parse snippet'); } } $type = $value->getName(); switch ($type) { case self::SECONDLIFE_TYPE_INTEGER: require_once 'Zend/Service/SecondLife/Value/Integer.php'; $secondlife_value = new Zend_Service_SecondLife_Value_Integer($value); break; case self::SECONDLIFE_TYPE_BOOLEAN: require_once 'Zend/Service/SecondLife/Value/Boolean.php'; $secondlife_value = new Zend_Service_SecondLife_Value_Boolean($value); break; case self::SECONDLIFE_TYPE_STRING: require_once 'Zend/Service/SecondLife/Value/String.php'; $secondlife_value = new Zend_Service_SecondLife_Value_String($value); break; case self::SECONDLIFE_TYPE_MAP: $collection = array(); $values = array(); $keys = array(); foreach ($value->children() as $member) { if ($member->getName() == 'key') { $keys[] = (string) $member; } else { $values[] = self::fromXml($member)->getValue(); } } foreach ($keys as $pos => $key) { $collection[$key] = $values[$pos]; } require_once 'Zend/Service/SecondLife/Value/Map.php'; $secondlife_value = new Zend_Service_SecondLife_Value_Map($collection); break; case self::SECONDLIFE_TYPE_ARRAY: $values = array(); foreach ($value->children() as $member) { $values[] = self::fromXml($member)->getValue(); } require_once 'Zend/Service/SecondLife/Value/Array.php'; $secondlife_value = new Zend_Service_SecondLife_Value_Array($values); break; case self::SECONDLIFE_TYPE_ROOT: require_once 'Zend/Service/SecondLife/Value/Llsd.php'; $secondlife_value = new Zend_Service_SecondLife_Value_Llsd(count($value->children()) > 0 ? self::fromXml($value->children()) : null); break; case self::SECONDLIFE_TYPE_KEY: require_once 'Zend/Service/SecondLife/Value/Exception.php'; throw new Zend_Service_SecondLife_Value_Exception('Type "key" cannot be used standalone'); break; default: require_once 'Zend/Service/SecondLife/Value/Exception.php'; throw new Zend_Service_SecondLife_Value_Exception(sprintf('Type "%s" not handled', is_object($value) ? get_class($value) : gettype($value))); } $secondlife_value->_setXml($value->asXml()); return $secondlife_value; }