PHP XML Parser
PHP XML Parser Reference: XML 파서 기능 가이드
PHP XML Parser는 PHP에서 XML 데이터를 분석하고 처리할 수 있도록 해주는 기본적인 확장 기능입니다. 이 파서는 이벤트 기반으로 작동하는 SAX(Simple API for XML) 스타일의 파서를 사용합니다. SAX 파서는 메모리 효율적이며, XML 문서를 순차적으로 읽고 분석하는 동안 특정 이벤트(태그 시작, 태그 끝 등)가 발생하면 이를 처리할 수 있도록 합니다.
이 가이드는 PHP XML Parser 확장의 주요 함수와 사용 방법을 설명합니다.
1. XML 파서의 기본 개념
PHP XML Parser는 이벤트 기반 파서로, XML 문서를 한 번에 메모리로 읽는 대신, 문서를 순차적으로 처리합니다. 각 요소나 속성에 도달할 때마다 이벤트가 발생하고, 이러한 이벤트에 대한 핸들러를 정의하여 XML을 처리할 수 있습니다.
2. XML Parser 생성 및 해제
2.1 xml_parser_create()
xml_parser_create()
함수는 새로운 XML 파서를 생성하고 파서 리소스를 반환합니다.
-
구문:
resource xml_parser_create ([ string $encoding ])
-
예시:
<?php $parser = xml_parser_create(); ?>
2.2 xml_parser_free()
파서를 사용한 후에는 xml_parser_free()
를 사용하여 파서 리소스를 해제해야 합니다.
-
구문:
bool xml_parser_free ( resource $parser )
-
예시:
<?php xml_parser_free($parser); ?>
3. XML Parser 옵션
3.1 xml_parser_set_option()
이 함수는 파서의 다양한 옵션을 설정하는 데 사용됩니다.
-
구문:
bool xml_parser_set_option ( resource $parser , int $option , mixed $value )
-
주요 옵션:
XML_OPTION_CASE_FOLDING
: 태그 이름을 대문자로 변환할지 여부를 설정합니다.XML_OPTION_TARGET_ENCODING
: 출력의 문자 인코딩을 설정합니다.
-
예시:
<?php $parser = xml_parser_create(); // 태그 이름을 대문자로 변환하지 않음 xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0); // UTF-8 인코딩으로 설정 xml_parser_set_option($parser, XML_OPTION_TARGET_ENCODING, "UTF-8"); ?>
4. XML 파서의 이벤트 핸들러 설정
XML Parser는 태그 시작, 태그 종료, 문자 데이터를 읽을 때마다 이벤트를 발생시키며, 이를 처리하기 위한 핸들러를 등록할 수 있습니다.
4.1 xml_set_element_handler()
xml_set_element_handler()
함수는 XML 태그가 시작될 때와 종료될 때 호출될 함수를 설정합니다.
-
구문:
bool xml_set_element_handler ( resource $parser , callable $start_element_handler , callable $end_element_handler )
-
예시:
<?php // 태그 시작 핸들러 function startElement($parser, $name, $attrs) { echo "시작 태그: $name\\\\n"; } // 태그 종료 핸들러 function endElement($parser, $name) { echo "종료 태그: $name\\\\n"; } $parser = xml_parser_create(); xml_set_element_handler($parser, "startElement", "endElement"); $xml = "<note><to>Tove</to><from>Jani</from></note>"; xml_parse($parser, $xml); xml_parser_free($parser); ?>
-
출력:
시작 태그: NOTE 시작 태그: TO 종료 태그: TO 시작 태그: FROM 종료 태그: FROM 종료 태그: NOTE
4.2 xml_set_character_data_handler()
이 함수는 XML 문서에서 태그 사이의 텍스트 데이터를 처리하는 핸들러를 설정합니다.
-
구문:
bool xml_set_character_data_handler ( resource $parser , callable $handler )
-
예시:
<?php function characterData($parser, $data) { echo "데이터: $data\\\\n"; } $parser = xml_parser_create(); xml_set_element_handler($parser, "startElement", "endElement"); xml_set_character_data_handler($parser, "characterData"); $xml = "<note><to>Tove</to><from>Jani</from></note>"; xml_parse($parser, $xml); xml_parser_free($parser); ?>
-
출력:
시작 태그: NOTE 시작 태그: TO 데이터: Tove 종료 태그: TO 시작 태그: FROM 데이터: Jani 종료 태그: FROM 종료 태그: NOTE
5. XML 데이터 파싱
5.1 xml_parse()
xml_parse()
함수는 XML 데이터를 파싱하고 이벤트를 발생시킵니다.
-
구문:
int xml_parse ( resource $parser , string $data [, bool $is_final = false ] )
-
예시:
<?php $xml = "<note><to>Tove</to><from>Jani</from></note>"; $parser = xml_parser_create(); xml_set_element_handler($parser, "startElement", "endElement"); xml_set_character_data_handler($parser, "characterData"); if (!xml_parse($parser, $xml, true)) { die(sprintf( "XML 오류: %s at line %d", xml_error_string(xml_get_error_code($parser)), xml_get_current_line_number($parser) )); } xml_parser_free($parser); ?>
6. XML 파싱 오류 처리
6.1 xml_get_error_code()
xml_get_error_code()
함수는 마지막 XML 파싱 오류의 코드를 반환합니다.
-
구문:
int xml_get_error_code ( resource $parser )
6.2 xml_error_string()
xml_error_string()
함수는 오류 코드를 설명하는 문자열을 반환합니다.
-
구문:
string xml_error_string ( int $code )
6.3 xml_get_current_line_number()
이 함수는 파싱 중 오류가 발생한 현재 줄 번호를 반환합니다.
-
예시:
<?php $xml = "<note><to>Tove</from></note>"; // 잘못된 XML $parser = xml_parser_create(); if (!xml_parse($parser, $xml)) { $code = xml_get_error_code($parser); echo "XML 오류: " . xml_error_string($code); echo " at line " . xml_get_current_line_number($parser); } xml_parser_free($parser); ?>
-
출력:
XML 오류: mismatched tag at line 1
7. 네임스페이스 처리
7.1 xml_parser_create_ns()
네임스페이스를 포함한 XML 문서를 처리할 때는 xml_parser_create_ns()
함수를 사용하여 파서를 생성합니다.
-
구문:
resource xml_parser_create_ns ([ string $encoding [, string $separator = ":" ]] )
-
예시:
<?php $xml = '<root xmlns:h="<http://www.w3.org/TR/html4/>"> <h:table> <h:tr><h:td>Apples</h:td><h:td>Bananas</h:td></h:tr> </h:table> </root>'; $parser = xml_parser_create_ns(); xml_set_element_handler($parser, "startElement", "endElement"); xml_set_character_data_handler($parser, "characterData"); xml_parse($parser, $xml); xml_parser_free($parser); function startElement($parser, $name, $attrs) { echo "시작 태그: $name\\\\n"; } function endElement($parser, $name) { echo "종료 태그: $name\\\\n"; } function characterData($parser, $data) { echo "데이터: $data\\\\n"; } ?>
-
출력:
시작 태그: ROOT 시작 태그: h:TABLE 시작 태그: h:TR 시작 태그: h:TD 데이터: Apples 종료 태그: h:TD 시작 태그: h:TD 데이터: Bananas 종료 태그: h:TD 종료 태그: h:TR 종료 태그: h:TABLE 종료 태그: ROOT
요약
PHP의 XML Parser 확장은 SAX 스타일의 이벤트 기반 XML 파서를 제공하여, 메모리 효율적인 XML 파싱을 지원합니다. 태그의 시작, 끝, 문자 데이터를 처리할 수 있는 핸들러를 설정하여 XML 문서를 세부적으로 처리할 수 있으며, 오류 처리를 위한 다양한 함수도 제공합니다. 네임스페이스 처리 기능을 포함하여, 복잡한 XML 문서도 다룰 수 있습니다.