-
-
- /**
- * xml2array()는 지정된 XML 텍스트를 XML 구조의 배열로 변환합니다.
- * 인수: $contents - XML 텍스트
- * $get_attributes - 1 또는 0. 이것이 1인 경우 함수 태그 값뿐만 아니라 속성도 가져옵니다. 이로 인해 반환 값의 배열 구조가 달라집니다.
- * $priority - '태그' 또는 '속성'일 수 있습니다. 그러면 결과 배열 구조가 변경됩니다. '태그'의 경우 태그의 중요성이 더 높습니다.
- * 반환: 배열 형식의 구문 분석된 XML입니다. 결과 배열 구조를 보려면 print_r()을 사용하십시오.
- * 예: $array = xml2array(file_get_contents('feed.xml'));
- * $array = xml2array(file_get_contents('feed.xml', 1) , '속성'));
- */
- function xml2array($contents, $get_attributes=1, $priority = 'tag') {
- if(!$contents) return array();
- if(!function_exists('xml_parser_create')) {
- //print "'xml_parser_create()' 함수 없음 found!";
- return array();
- }
- //PHP의 XML 파서 가져오기 - 파서가 작동하려면 PHP에 이 모듈이 있어야 합니다
- $parser = xml_parser_create('');
- xml_parser_set_option($parser, XML_OPTION_TARGET_ENCODING, "UTF-8");
- xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0);
- xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 1);
- xml_parse_into_struct($parser, Trim($contents), $xml_values);
- xml_parser_free($ 파서);
- if(!$xml_values) return;//흠...
- //초기화 bbs.it-home.org
- $xml_array = array();
- $parents = array ();
- $opened_tags = array();
- $arr = array();
- $current = &$xml_array; //참조
- //태그를 살펴보세요.
- $repeated_tag_index = array();//같은 이름을 가진 여러 태그가 배열로 변환됩니다
- foreach($xml_values as $data) {
- unset($attributes,$value);//기존 값을 제거하지 않으면 문제가 발생합니다
- //이 명령은 이러한 변수를 foreach 범위로 추출합니다
- // tag(string), type(string) , level(int), attribute(array).
- extract($data);//배열 자체를 사용할 수도 있지만 이 방법이 더 멋집니다.
- $result = array();
- $attributes_data = array();
if(isset($value)) {
- if($priority == 'tag') $result = $value;
- else $result ['값'] = $값; //'속성' 모드인 경우 연관 배열에 값을 넣습니다
- }
- //속성도 설정합니다.
- if(isset($attributes) and $get_attributes) {
- foreach($attributes as $attr => $val) {
- if($priority == 'tag') $attributes_data[$attr] = $val;
- else $result['attr'][$ 속성] = $val; //'attr'이라는 배열에 모든 속성을 설정합니다
- }
- }
- //태그 상태를 확인하고 필요한 작업을 수행합니다.
- if($type == "open") {// 태그 시작 ''
- $parent[$level-1] = &$current;
- if(!is_array($current) 또는 (!in_array($tag, array_keys($current) )))) { //새 태그 삽입
- $current[$tag] = $result;
- if($attributes_data) $current[$tag. '_attr'] = $attributes_data;
- $repeated_tag_index[$tag.'_'.$level] = 1;
- $current = &$current[$tag];
- } else { //거기 동일한 태그 이름을 가진 다른 요소
- if(isset($current[$tag][0])) {//0번째 요소가 있으면 이미 배열입니다
- $current[$tag][ $repeated_tag_index[$tag.'_'.$level]] = $result;
- $repeated_tag_index[$tag.'_'.$level] ;
- } else {//이 섹션에서는 값을 동일한 이름을 가진 여러 태그가 함께 나타나는 경우 배열
- $current[$tag] = array($current[$tag],$result);//기존 항목과 새 항목을 결합하여 배열을 만듭니다.
- $repeated_tag_index[$tag.'_'.$level] = 2;
if(isset($current[$tag.'_attr'])) { // 마지막(0번째) 태그의 속성도 이동해야 합니다
- $current[$tag]['0_attr'] = $current[$tag.'_attr'];
- unset($current[$tag .'_attr']);
- }
- }
- $last_item_index = $repeated_tag_index[$tag.'_'.$level]-1;
- $current = &$current[$tag] [$last_item_index];
- }
- } elseif($type == "complete") { //한 줄로 끝나는 태그 ''
- //키가 있는지 확인 이미 사용되었습니다.
- if(!isset($current[$tag])) { //새 키
- $current[$tag] = $result;
- $repeated_tag_index[$tag.'_'. $level] = 1;
- if($priority == 'tag' 및 $attributes_data) $current[$tag. '_attr'] = $attributes_data;
- } else { //만약 취했다면 모든 것을 목록(배열) 안에 넣습니다
- if(isset($current[$tag][0]) 및 is_array($current [$tag])) {//이미 배열인 경우...
- // ...새 요소를 해당 배열에 푸시합니다.
- $current[$tag][$repeated_tag_index[$tag. '_'.$level]] = $result;
if($priority == 'tag' 및 $get_attributes 및 $attributes_data) {
- $current[$tag] [$repeated_tag_index[$tag.'_'.$level] . '_attr'] = $attributes_data;
- }
- $repeated_tag_index[$tag.'_'.$level] ;
- }else { //배열이 아닌 경우...
- $current[$tag] = array($current[$tag],$result); //...기존 값과 새 값을 사용하여 배열로 만듭니다
- $repeated_tag_index[$tag.'_'.$level] = 1;
- if($priority == 'tag' and $get_attributes) {
- if(isset($current[$tag.'_attr'])) { //마지막(0번째) 태그의 속성도 함께 이동해야 합니다
- unset($current[$tag.'_attr']);
- }
if($attributes_data) {
- $current[$tag][$repeated_tag_index[$tag.'_'.$level] . '_attr'] = $attributes_data;
- }
- }
- $repeated_tag_index[$tag.'_'.$level] ; //0 및 1 인덱스는 이미 사용 중입니다
- }
- }
- } elseif($type == 'close') { //'' 태그 끝
- $current = &$parent[$level-1];
- }
- }
return($xml_array);
- }
- ?>
复代码 调用示例:
- //php之XML转数组函数 调用
- $arr = xml2array(file_get_contents("tools.xml") ,1,'속성');
- ?>
复제대码
|