/** * @param string $xml * * @return bool * * @throws ParserException */ public static function isValid($xml) { $useErrors = libxml_use_internal_errors(true); $isCorrect = simplexml_load_string($xml); libxml_use_internal_errors($useErrors); if (false === $isCorrect) { throw ParserException::notXml($xml); } return true; }
/** * {@inheritdoc} */ public function parse($xmlString) { if ($this->validateResponse) { XmlChecker::isValid($xmlString); } $result = xmlrpc_decode($xmlString, 'UTF-8'); if ($result === null && self::isBiggerThanParseLimit($xmlString)) { throw ParserException::xmlrpcExtensionLibxmlParsehugeNotSupported(); } $toBeVisited = [&$result]; while (isset($toBeVisited[0]) && ($value =& $toBeVisited[0])) { $type = gettype($value); if ($type === 'object') { $xmlRpcType = $value->{'xmlrpc_type'}; if ($xmlRpcType === 'datetime') { $value = \DateTime::createFromFormat('Ymd\\TH:i:s', $value->scalar, isset($timezone) ? $timezone : ($timezone = new \DateTimeZone('UTC'))); } elseif ($xmlRpcType === 'base64') { if ($value->scalar !== '') { $value = Base64Value::serialize($value->scalar); } else { $value = null; } } } elseif ($type === 'array') { foreach ($value as &$element) { $toBeVisited[] =& $element; } } array_shift($toBeVisited); } if (is_array($result)) { reset($result); if (xmlrpc_is_fault($result)) { throw FaultException::createFromResponse($result); } } return $result; }