PageRenderTime 39ms CodeModel.GetById 12ms RepoModel.GetById 0ms app.codeStats 0ms

/includes/lib/Braintree/lib/Braintree/Xml/Parser.php

https://github.com/strangerstudios/paid-memberships-pro
PHP | 140 lines | 103 code | 10 blank | 27 comment | 13 complexity | af8f3729c58efd1d8f8fbf2672faf8a8 MD5 | raw file
  1. <?php
  2. namespace Braintree\Xml;
  3. use DateTime;
  4. use DateTimeZone;
  5. use DOMDocument;
  6. use DOMElement;
  7. use DOMText;
  8. use Braintree\Util;
  9. /**
  10. * Braintree XML Parser
  11. */
  12. class Parser
  13. {
  14. /**
  15. * Converts an XML string into a multidimensional array
  16. *
  17. * @param string $xml
  18. * @return array
  19. */
  20. public static function arrayFromXml($xml)
  21. {
  22. $document = new DOMDocument('1.0', 'UTF-8');
  23. $document->loadXML($xml);
  24. $root = $document->documentElement->nodeName;
  25. return Util::delimiterToCamelCaseArray([
  26. $root => self::_nodeToValue($document->childNodes->item(0)),
  27. ]);
  28. }
  29. /**
  30. * Converts a node to an array of values or nodes
  31. *
  32. * @param DOMNode @node
  33. * @return mixed
  34. */
  35. private static function _nodeToArray($node)
  36. {
  37. $type = null;
  38. if ($node instanceof DOMElement) {
  39. $type = $node->getAttribute('type');
  40. }
  41. switch($type) {
  42. case 'array':
  43. $array = [];
  44. foreach ($node->childNodes as $child) {
  45. $value = self::_nodeToValue($child);
  46. if ($value !== null) {
  47. $array[] = $value;
  48. }
  49. }
  50. return $array;
  51. case 'collection':
  52. $collection = [];
  53. foreach ($node->childNodes as $child) {
  54. $value = self::_nodetoValue($child);
  55. if ($value !== null) {
  56. if (!isset($collection[$child->nodeName])) {
  57. $collection[$child->nodeName] = [];
  58. }
  59. $collection[$child->nodeName][] = self::_nodeToValue($child);
  60. }
  61. }
  62. return $collection;
  63. default:
  64. $values = [];
  65. if ($node->childNodes->length === 1 && $node->childNodes->item(0) instanceof DOMText) {
  66. return $node->childNodes->item(0)->nodeValue;
  67. } else {
  68. foreach ($node->childNodes as $child) {
  69. if (!$child instanceof DOMText) {
  70. $values[$child->nodeName] = self::_nodeToValue($child);
  71. }
  72. }
  73. return $values;
  74. }
  75. }
  76. }
  77. /**
  78. * Converts a node to a PHP value
  79. *
  80. * @param DOMNode $node
  81. * @return mixed
  82. */
  83. private static function _nodeToValue($node)
  84. {
  85. $type = null;
  86. if ($node instanceof DOMElement) {
  87. $type = $node->getAttribute('type');
  88. }
  89. switch($type) {
  90. case 'datetime':
  91. return self::_timestampToUTC((string) $node->nodeValue);
  92. case 'date':
  93. return new DateTime((string) $node->nodeValue);
  94. case 'integer':
  95. return (int) $node->nodeValue;
  96. case 'boolean':
  97. $value = (string) $node->nodeValue;
  98. if(is_numeric($value)) {
  99. return (bool) $value;
  100. } else {
  101. return ($value !== "true") ? false : true;
  102. }
  103. case 'array':
  104. case 'collection':
  105. return self::_nodeToArray($node);
  106. default:
  107. if ($node->hasChildNodes()) {
  108. return self::_nodeToArray($node);
  109. } elseif (trim($node->nodeValue) === '') {
  110. return null;
  111. } else {
  112. return $node->nodeValue;
  113. }
  114. }
  115. }
  116. /**
  117. * Converts XML timestamps into DateTime instances
  118. *
  119. * @param string $timestamp
  120. * @return DateTime
  121. */
  122. private static function _timestampToUTC($timestamp)
  123. {
  124. $tz = new DateTimeZone('UTC');
  125. $dateTime = new DateTime($timestamp, $tz);
  126. $dateTime->setTimezone($tz);
  127. return $dateTime;
  128. }
  129. }
  130. class_alias('Braintree\Xml\Parser', 'Braintree_Xml_Parser');