코딩 스쿨 PHP

언어선택 : HTMLCSSJAVAJAVASCRIPTMYSQLSQL PHP

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 문서도 다룰 수 있습니다.


copyright ⓒ 스타트코딩 all rights reserved.
이메일 : startcodingim@gamil.com