-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathXMLParser.php
More file actions
80 lines (75 loc) · 2.69 KB
/
Copy pathXMLParser.php
File metadata and controls
80 lines (75 loc) · 2.69 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
<?php
/**
* Convert an xml file to an associative array (including the tag attributes):
*
* @param Str $xml file/string.
*/
class xmlToArrayParser {
/**
* The array created by the parser which can be assigned to a variable with: $varArr = $domObj->array.
*
* @var Array
*/
public $array;
private $parser;
private $pointer;
/**
* $domObj = new xmlToArrayParser($xml);
*
* @param Str $xml file/string
*/
public function __construct($xml) {
$this->pointer =& $this->array;
$this->parser = xml_parser_create("UTF-8");
xml_set_object($this->parser, $this);
xml_parser_set_option($this->parser, XML_OPTION_CASE_FOLDING, false);
xml_set_element_handler($this->parser, "tag_open", "tag_close");
xml_set_character_data_handler($this->parser, "cdata");
xml_parse($this->parser, ltrim($xml));
}
private function tag_open($parser, $tag, $attributes) {
$this->convert_to_array($tag, '_');
$idx=$this->convert_to_array($tag, 'cdata');
if(isset($idx)) {
$this->pointer[$tag][$idx] = Array('@idx' => $idx,'@parent' => &$this->pointer);
$this->pointer =& $this->pointer[$tag][$idx];
}else {
$this->pointer[$tag] = Array('@parent' => &$this->pointer);
$this->pointer =& $this->pointer[$tag];
}
if (!empty($attributes)) { $this->pointer['_'] = $attributes; }
}
/**
* Adds the current elements content to the current pointer[cdata] array.
*/
private function cdata($parser, $cdata) {
if(isset($this->pointer['cdata'])) { $this->pointer['cdata'] .= $cdata;}
else { $this->pointer['cdata'] = $cdata;}
}
private function tag_close($parser, $tag) {
$current = & $this->pointer;
if(isset($this->pointer['@idx'])) {unset($current['@idx']);}
$this->pointer = & $this->pointer['@parent'];
unset($current['@parent']);
if(isset($current['cdata']) && count($current) == 1) { $current = $current['cdata'];}
else if(empty($current['cdata'])) { unset($current['cdata']); }
}
/**
* Converts a single element item into array(element[0]) if a second element of the same name is encountered.
*/
private function convert_to_array($tag, $item) {
if(isset($this->pointer[$tag][$item])) {
$content = $this->pointer[$tag];
$this->pointer[$tag] = array((0) => $content);
$idx = 1;
}else if (isset($this->pointer[$tag])) {
$idx = count($this->pointer[$tag]);
if(!isset($this->pointer[$tag][0])) {
foreach ($this->pointer[$tag] as $key => $value) {
unset($this->pointer[$tag][$key]);
$this->pointer[$tag][0][$key] = $value;
}}}else $idx = null;
return $idx;
}
}
?>