Notes:
1. Ignores content that is not in between it's own set of tags.
2. 'attrib' and 'cdata' are keys added to the array when the element contains both attributes and content.
Usage:
$domObj = new xmlToArrayParser($xml);
$domArr = $domObj->array;
eg.
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<top>
<element1>element content 1</element1>
<element2 var2="val2" />
<element3 var3="val3" var4="val4">element content 3</element3>
<element3 var5="val5">element content 4</element3>
<element3 var6="val6" />
<element3>element content 7</element3>
</top>
$domArr['top']['element1'] => element content 1
$domArr['top']['element2']['attrib']['var2'] => val2
$domArr['top']['element3']['0']['attrib']['var3'] => val3
$domArr['top']['element3']['0']['attrib']['var4'] => val4
$domArr['top']['element3']['0']['cdata'] => element content 3
$domArr['top']['element3']['1']['attrib']['var5'] => val5
$domArr['top']['element3']['1']['cdata'] => element content 4
$domArr['top']['element3']['2']['attrib']['var6'] => val6
$domArr['top']['element3']['3'] => element content 7
<?php
/**
* Convert an xml file to an associative array (including the tag attributes):
*/
class xmlToArrayParser {
public $array;
private $parser;
private $pointer;
/**
* $domObj = new xmlToArrayParser($xml);
*
* @param String $xml
*/
public function __construct($xml) {
$this->pointer =& $this->array;
$this->parser = xml_parser_create();
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) {
$idx=$this->convert_to_array($tag, 'attrib');
$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['attrib'] = $attributes; }
}
private function cdata($parser, $cdata) { $this->pointer['cdata'] = trim($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;
}
}
?>
----
Server IP: 66.207.199.35
Probable Submitter: 206.75.202.212
----
Manual Page -- http://www.php.net/manual/en/ref.xml.php
Edit -- https://master.php.net/note/edit/99754
Del: integrated -- https://master.php.net/note/delete/99754/integrated
Del: useless -- https://master.php.net/note/delete/99754/useless
Del: bad code -- https://master.php.net/note/delete/99754/bad+code
Del: spam -- https://master.php.net/note/delete/99754/spam
Del: non-english -- https://master.php.net/note/delete/99754/non-english
Del: in docs -- https://master.php.net/note/delete/99754/in+docs
Del: other reasons-- https://master.php.net/note/delete/99754
Reject -- https://master.php.net/note/reject/99754
Search -- https://master.php.net/manage/user-notes.php