/includes/lib/Braintree/lib/Braintree/Xml/Generator.php
https://github.com/strangerstudios/paid-memberships-pro · PHP · 149 lines · 94 code · 11 blank · 44 comment · 14 complexity · 3a4f2ad0e8c6ae17788c218587dcfc03 MD5 · raw file
- <?php
- namespace Braintree\Xml;
- use DateTime;
- use DateTimeZone;
- use XMLWriter;
- use Braintree\Util;
- /**
- * PHP version 5
- */
- /**
- * Generates XML output from arrays using PHP's
- * built-in XMLWriter
- */
- class Generator
- {
- /**
- * arrays passed to this method should have a single root element
- * with an array as its value
- * @param array $aData the array of data
- * @return string XML string
- */
- public static function arrayToXml($aData)
- {
- $aData = Util::camelCaseToDelimiterArray($aData, '-');
- // set up the XMLWriter
- $writer = new XMLWriter();
- $writer->openMemory();
- $writer->setIndent(true);
- $writer->setIndentString(' ');
- $writer->startDocument('1.0', 'UTF-8');
- // get the root element name
- $aKeys = array_keys($aData);
- $rootElementName = $aKeys[0];
- // open the root element
- $writer->startElement($rootElementName);
- // create the body
- self::_createElementsFromArray($writer, $aData[$rootElementName], $rootElementName);
- // close the root element and document
- $writer->endElement();
- $writer->endDocument();
- // send the output as string
- return $writer->outputMemory();
- }
- /**
- * Construct XML elements with attributes from an associative array.
- *
- * @access protected
- * @static
- * @param object $writer XMLWriter object
- * @param array $aData contains attributes and values
- * @return void
- */
- private static function _createElementsFromArray(&$writer, $aData)
- {
- if (!is_array($aData)) {
- if (is_bool($aData)) {
- $writer->text($aData ? 'true' : 'false');
- } else {
- $writer->text($aData);
- }
- return;
- }
- foreach ($aData AS $elementName => $element) {
- // handle child elements
- $writer->startElement($elementName);
- if (is_array($element)) {
- if (array_key_exists(0, $element) || empty($element)) {
- $writer->writeAttribute('type', 'array');
- foreach ($element AS $ignored => $itemInArray) {
- $writer->startElement('item');
- self::_createElementsFromArray($writer, $itemInArray);
- $writer->endElement();
- }
- }
- else {
- self::_createElementsFromArray($writer, $element);
- }
- } else {
- // generate attributes as needed
- $attribute = self::_generateXmlAttribute($element);
- if (is_array($attribute)) {
- $writer->writeAttribute($attribute[0], $attribute[1]);
- $element = $attribute[2];
- }
- $writer->text($element);
- }
- $writer->endElement();
- }
- }
- /**
- * convert passed data into an array of attributeType, attributeName, and value
- * dates sent as DateTime objects will be converted to strings
- * @access protected
- * @param mixed $value
- * @return array attributes and element value
- */
- private static function _generateXmlAttribute($value)
- {
- if ($value instanceof DateTime) {
- return ['type', 'datetime', self::_dateTimeToXmlTimestamp($value)];
- }
- if (is_int($value)) {
- return ['type', 'integer', $value];
- }
- if (is_bool($value)) {
- return ['type', 'boolean', ($value ? 'true' : 'false')];
- }
- if ($value === NULL) {
- return ['nil', 'true', $value];
- }
- }
- /**
- * converts datetime back to xml schema format
- * @access protected
- * @param object $dateTime
- * @return string XML schema formatted timestamp
- */
- private static function _dateTimeToXmlTimestamp($dateTime)
- {
- $dateTimeForUTC = clone $dateTime;
- $dateTimeForUTC->setTimeZone(new DateTimeZone('UTC'));
- return ($dateTimeForUTC->format('Y-m-d\TH:i:s') . 'Z');
- }
- private static function _castDateTime($string)
- {
- try {
- if (empty($string)) {
- return false;
- }
- $dateTime = new DateTime($string);
- return self::_dateTimeToXmlTimestamp($dateTime);
- } catch (Exception $e) {
- // not a datetime
- return false;
- }
- }
- }
- class_alias('Braintree\Xml\Generator', 'Braintree_Xml_Generator');