XmlParser.php 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. <?php
  2. namespace ModulesGarden\Servers\KerioEmail\App\Libs\Kerio\Components\Api\Soap\Helpers;
  3. /**
  4. *
  5. * Created by PhpStorm.
  6. * User: Tomasz Bielecki ( tomasz.bi@modulesgarden.com )
  7. * Date: 28.08.19
  8. * Time: 14:42
  9. * Class XmlParser
  10. */
  11. class XmlParser
  12. {
  13. /**
  14. * @var array
  15. */
  16. var $stack=array();
  17. /**
  18. * @var
  19. */
  20. var $stack_ref;
  21. /**
  22. * @var array
  23. */
  24. var $arrOutput = array();
  25. /**
  26. * @var
  27. */
  28. var $resParser;
  29. /**
  30. * @var
  31. */
  32. var $strXmlData;
  33. /**
  34. * @param $pos
  35. */
  36. public function push_pos(&$pos)
  37. {
  38. $this->stack[count($this->stack)]=&$pos;
  39. $this->stack_ref=&$pos;
  40. }
  41. /**
  42. *
  43. */
  44. public function pop_pos()
  45. {
  46. unset($this->stack[count($this->stack)-1]);
  47. $this->stack_ref=&$this->stack[count($this->stack)-1];
  48. }
  49. /**
  50. * @param $strInputXML
  51. * @return array
  52. */
  53. public function parse($strInputXML)
  54. {
  55. $this->resParser = xml_parser_create ();
  56. xml_set_object($this->resParser,$this);
  57. xml_set_element_handler($this->resParser, "tagOpen", "tagClosed");
  58. xml_set_character_data_handler($this->resParser, "tagData");
  59. $this->push_pos($this->arrOutput);
  60. $this->strXmlData = xml_parse($this->resParser,$strInputXML );
  61. if(!$this->strXmlData)
  62. {
  63. var_dump(sprintf("XML error: %s at line %d",
  64. xml_error_string(xml_get_error_code($this->resParser)),
  65. xml_get_current_line_number($this->resParser)));
  66. die();
  67. }
  68. xml_parser_free($this->resParser);
  69. return $this->arrOutput;
  70. }
  71. /**
  72. * @param $parser
  73. * @param $name
  74. * @param $attrs
  75. */
  76. public function tagOpen($parser, $name, $attrs)
  77. {
  78. if (isset($this->stack_ref[$name]))
  79. {
  80. if (!isset($this->stack_ref[$name][0]))
  81. {
  82. $tmp=$this->stack_ref[$name];
  83. unset($this->stack_ref[$name]);
  84. $this->stack_ref[$name][0]=$tmp;
  85. }
  86. $cnt=count($this->stack_ref[$name]);
  87. $this->stack_ref[$name][$cnt]=array();
  88. if (isset($attrs))
  89. $this->stack_ref[$name][$cnt]=$attrs;
  90. $this->push_pos($this->stack_ref[$name][$cnt]);
  91. }
  92. else
  93. {
  94. $this->stack_ref[$name]=array();
  95. if (isset($attrs))
  96. $this->stack_ref[$name]=$attrs;
  97. $this->push_pos($this->stack_ref[$name]);
  98. }
  99. }
  100. /**
  101. * @param $parser
  102. * @param $tagData
  103. */
  104. public function tagData($parser, $tagData)
  105. {
  106. if(trim($tagData))
  107. {
  108. if(isset($this->stack_ref['DATA']))
  109. $this->stack_ref['DATA'] .= $tagData;
  110. else
  111. $this->stack_ref['DATA'] = $tagData;
  112. }
  113. }
  114. /**
  115. * @param $parser
  116. * @param $name
  117. */
  118. public function tagClosed($parser, $name)
  119. {
  120. $this->pop_pos();
  121. }
  122. }