82 lines
2.1 KiB
PHP
82 lines
2.1 KiB
PHP
<?php
|
|
/***************************************************************************
|
|
* For license information see doc/license.txt
|
|
*
|
|
* Unicode Reminder メモ
|
|
***************************************************************************/
|
|
|
|
class xml2Array {
|
|
|
|
var $stack=array();
|
|
var $stack_ref;
|
|
var $arrOutput = array();
|
|
var $resParser;
|
|
var $strXmlData;
|
|
|
|
function push_pos(&$pos) {
|
|
$this->stack[count($this->stack)]=&$pos;
|
|
$this->stack_ref=&$pos;
|
|
}
|
|
|
|
function pop_pos() {
|
|
unset($this->stack[count($this->stack)-1]);
|
|
$this->stack_ref=&$this->stack[count($this->stack)-1];
|
|
}
|
|
|
|
function parse($strInputXML) {
|
|
|
|
$this->resParser = xml_parser_create("UTF-8");
|
|
xml_set_object($this->resParser,$this);
|
|
xml_set_element_handler($this->resParser, "tagOpen", "tagClosed");
|
|
|
|
xml_set_character_data_handler($this->resParser, "tagData");
|
|
|
|
$this->push_pos($this->arrOutput);
|
|
|
|
$this->strXmlData = xml_parse($this->resParser,$strInputXML );
|
|
if(!$this->strXmlData) {
|
|
die(sprintf("XML error: %s at line %d",
|
|
xml_error_string(xml_get_error_code($this->resParser)),
|
|
xml_get_current_line_number($this->resParser)));
|
|
}
|
|
|
|
xml_parser_free($this->resParser);
|
|
|
|
return $this->arrOutput;
|
|
}
|
|
|
|
function tagOpen($parser, $name, $attrs) {
|
|
if (isset($this->stack_ref[$name])) {
|
|
if (!isset($this->stack_ref[$name][0])) {
|
|
$tmp=$this->stack_ref[$name];
|
|
unset($this->stack_ref[$name]);
|
|
$this->stack_ref[$name][0]=$tmp;
|
|
}
|
|
$cnt=count($this->stack_ref[$name]);
|
|
$this->stack_ref[$name][$cnt]=array();
|
|
if (isset($attrs))
|
|
$this->stack_ref[$name][$cnt]=$attrs;
|
|
$this->push_pos($this->stack_ref[$name][$cnt]);
|
|
}
|
|
else {
|
|
$this->stack_ref[$name]=array();
|
|
if (isset($attrs))
|
|
$this->stack_ref[$name]=$attrs;
|
|
$this->push_pos($this->stack_ref[$name]);
|
|
}
|
|
}
|
|
|
|
function tagData($parser, $tagData) {
|
|
if(mb_trim($tagData)) {
|
|
if(isset($this->stack_ref['DATA']))
|
|
$this->stack_ref['DATA'] .= $tagData;
|
|
else
|
|
$this->stack_ref['DATA'] = $tagData;
|
|
}
|
|
}
|
|
|
|
function tagClosed($parser, $name) {
|
|
$this->pop_pos();
|
|
}
|
|
}
|
|
?>
|