http://life.qaris.net/life/17 에서 퍼옴

/*
//PHP를 이용한 XML Parse : 결과는 Array 로 리턴됨.
//파일을 이용한 XML 읽기 및 Parse
*/

//파일 읽기.
$file = “data.xml”;
if (!($fp = fopen($file, “r”))) {
die(“could not open XML input”);
}
$data = fread($fp, filesize($file));
fclose($fp);
//XML Parse 생성
$xml_parser = xml_parser_create();
//XML Parsing AND Free
xml_parse_into_struct($xml_parser, $data, $vals, $index);
xml_parser_free($xml_parser);
/*
//위 구문 설명
// 1. $vals 는 Parsing 결과가 저장되는 Array 변수임 .
// 2. foreach ( $vals as $xml_elem ) 을 통해 각 배열을 확인해보면
// $xml_elem 에는 tag | type | level | value | attributes 연관배열 Key값을 가진다.
// – tag : xml element name
// – type : open,complete,cdata,close 등의 값을 가짐
// – level : 네스팅 값을 가진 Root태그는 1 임.
// – value : VALUE
// – attributes : 연관 Array 임. (VALUE)
// 3. XML의 각 elements 와 attributes 는 대문자로 읽음.
*/

$params = array();
$level = array();
foreach ($vals as $xml_elem) {
if ($xml_elem[‘type’] == ‘open’) {
if (array_key_exists(‘attributes’,$xml_elem)) {
list($level[$xml_elem[‘level’]],$extra) = array_values($xml_elem[‘attributes’]);
} else {
$level[$xml_elem[‘level’]] = $xml_elem[‘tag’];
}
}
if ($xml_elem[‘type’] == ‘complete’) {
$start_level = 1;
$php_stmt = ‘$params’;
while($start_level < $xml_elem[‘level’]) {
$php_stmt .= ‘[$level[‘.$start_level.’]]’;
$start_level++;
}
$php_stmt .= ‘[$xml_elem[‘tag’]] = $xml_elem[‘value’];’;
eval($php_stmt);
}
}

echo ”

"; 
print_r ($params); 
echo "

“;

/*

Example :
I/P XML …

My Land
15E
40000

Hi State
1000
2000

13E
500
500

13E
500
5000

Low State
3000
20000

15E
5000
1500

O/P Array :
Array
(
[ZZ] => Array
(
[NAME] => My Land
[LOCATION] => 15E
[AREA] => 40000
[STATE1] => Array
(
[NAME] => Hi State
[AREA] => 1000
[POPULATION] => 2000
[CITY1] => Array
(
[LOCATION] => 13E
[POPULATION] => 500
[AREA] => 500
)

[CITY2] => Array
(
[LOCATION] => 13E
[POPULATION] => 500
[AREA] => 5000
)

)

[STATE2] => Array
(
[NAME] => Low State
[AREA] => 3000
[POPULATION] => 20000
[CITY1] => Array
(
[LOCATION] => 15E
[POPULATION] => 5000
[AREA] => 1500
)

)

)

)
*/
?>