Guest User

Untitled

a guest
Apr 21st, 2018
86
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.48 KB | None | 0 0
  1. function parseXml( $xml ) {
  2. $xml_parser = xml_parser_create();
  3. xml_parse_into_struct( $xml_parser, $XML, $vals );
  4. xml_parser_free( $xml_parser );
  5.  
  6. $_tmp = '';
  7. foreach ( $vals as $xml_elem ) {
  8. $x_tag = $xml_elem[ 'tag' ];
  9. $x_level = $xml_elem[ 'level' ];
  10. $x_type = $xml_elem[ 'type' ];
  11. if ( $x_level != 1 && $x_type == 'close' ) {
  12. if ( isset( $multi_key[ $x_tag ][ $x_level ] ) )
  13. $multi_key[ $x_tag ][ $x_level ] = 1;
  14. else
  15. $multi_key[ $x_tag ][ $x_level ] = 0;
  16. }
  17. if ( $x_level != 1 && $x_type == 'complete' ) {
  18. if ( $_tmp == $x_tag )
  19. $multi_key[ $x_tag ][ $x_level ] = 1;
  20. $_tmp = $x_tag;
  21. }
  22. }
  23.  
  24. foreach ( $vals as $xml_elem ) {
  25. $x_tag = $xml_elem[ 'tag' ];
  26. $x_level = $xml_elem[ 'level' ];
  27. $x_type = $xml_elem[ 'type' ];
  28. if ( $x_type == 'open' )
  29. $level[ $x_level ] = $x_tag;
  30. $start_level = 1;
  31. $php_stmt = '$xml_array';
  32. if ( $x_type == 'close' && $x_level != 1 )
  33. $multi_key[ $x_tag ][ $x_level ]++;
  34. while ( $start_level < $x_level ) {
  35. $php_stmt .= '[$level[' . $start_level . ']]';
  36. if ( isset( $multi_key[ $level[ $start_level ] ][ $start_level ] ) && $multi_key[ $level[ $start_level ] ][ $start_level ] )
  37. $php_stmt .= '[' . ( $multi_key[ $level[ $start_level ] ][ $start_level ] - 1 ) . ']';
  38. $start_level++;
  39. }
  40. $add = '';
  41. if ( isset( $multi_key[ $x_tag ][ $x_level ] ) && $multi_key[ $x_tag ][ $x_level ] && ( $x_type == 'open' || $x_type == 'complete' ) ) {
  42. if ( !isset( $multi_key2[ $x_tag ][ $x_level ] ) )
  43. $multi_key2[ $x_tag ][ $x_level ] = 0;
  44. else
  45. $multi_key2[ $x_tag ][ $x_level ]++;
  46. $add = '[' . $multi_key2[ $x_tag ][ $x_level ] . ']';
  47. }
  48. if ( isset( $xml_elem[ 'value' ] ) && trim( $xml_elem[ 'value' ] ) != '' && !array_key_exists( 'attributes', $xml_elem ) ) {
  49. if ( $x_type == 'open' )
  50. $php_stmt_main = $php_stmt . '[$x_type]' . $add . '['content'] = $xml_elem['value'];';
  51. else
  52. $php_stmt_main = $php_stmt . '[$x_tag]' . $add . ' = $xml_elem['value'];';
  53. eval( $php_stmt_main );
  54. }
  55. if ( array_key_exists( 'attributes', $xml_elem ) ) {
  56. if ( isset( $xml_elem[ 'value' ] ) ) {
  57. $php_stmt_main = $php_stmt . '[$x_tag]' . $add . '['content'] = $xml_elem['value'];';
  58. eval( $php_stmt_main );
  59. }
  60. foreach ( $xml_elem[ 'attributes' ] as $key => $value ) {
  61. $php_stmt_att = $php_stmt . '[$x_tag]' . $add . '[$key] = $value;';
  62. eval( $php_stmt_att );
  63. }
  64. }
  65. }
  66. return $xml_array;
  67. }
  68.  
  69. public function xmlMap(&$result_array, SimpleXMLElement $xmlArray): void
  70. {
  71. foreach($xmlArray as $key => $node) {
  72. $object = $this->getObject($node);
  73. if (!is_null($object)) {
  74. if (!is_null($object)) {
  75. if (!isset($result_array)) {
  76. $result_array = array();
  77. }
  78. $i=-1;
  79. foreach ($node as $child) {
  80. $object2 = $this->getObject($child);
  81. $i++;
  82. if (!is_null($object2)) {
  83. break;
  84. }
  85. }
  86. array_push($result_array, [$object, $node->children()[$i]->getName() => array()]);
  87. $this->xmlMap($result_array[count($result_array) - 1][$node->children()[$i]->getName()], $node);
  88. }
  89. }
  90. }
  91. }
  92.  
  93. $result_array - массив, в котором будут храниться полученные данные (передаётся по ссылке)
  94. $xmlArray - собственно наша переменная $xml
  95. getObject($node) - функция для создания объекта в зависимости от узла
  96.  
  97. public function getObject(SimpleXMLElement $node)
  98. {
  99. switch ($node->getName()) {
  100. case XmlParser::NODE_SPORT:
  101. $object = $this->getSportOrCountry($node, new Sport());
  102. break;
  103. case XmlParser::NODE_COUNTRY:
  104. $object = $this->getSportOrCountry($node, new Country());
  105. break;
  106. case XmlParser::NODE_TOURNAMENT:
  107. $object = $this->getTournament($node, new Tournament());
  108. break;
  109. case XmlParser::NODE_EVENT:
  110. $object = $this->getEvent($node, new Event());
  111. break;
  112. case XmlParser::NODE_SCOPE:
  113. $object = $this->getScope($node, new Scope());
  114. break;
  115. case XmlParser::NODE_MARKET:
  116. $object = $this->getMarket($node, new Market());
  117. break;
  118. case XmlParser::NODE_OUTCOME:
  119. $object = $this->getOutcome($node, new Outcome());
  120. break;
  121. default:
  122. $object = null;
  123. }
  124. return $object;
  125. }
  126.  
  127. $xml = new SimpleXMLElement($this->xml_document);
  128. $result_array = array();
  129. $this->xmlMap($result_array, $xml);
  130. var_dump($result_array);
Add Comment
Please, Sign In to add comment