PHP - SAX Parser Example: A Beginner's Guide

안녕하세요, 미래의 PHP 마법사 여러분! 오늘 우리는 PHP의 SAX 파싱 세계로 흥미로운 여정을 떠납니다. SAX에 대해 들어본 적이 없다면 걱정하지 마세요 - 이 튜토리얼이 끝나면 프로처럼 XML을 파싱할 수 있을 것입니다!

PHP - SAX Parser Example

SAX 파싱이란?

코드로 뛰어들기 전에 SAX 파싱이 무엇인지 이야기해보겠습니다. SAX는 "Simple API for XML"의 약자입니다. 대형 파일을 다루거나 XML을 읽는 동안 즉시 처리하고 싶을 때 특히 유용한 방법입니다.

상상해보세요. 책을 읽는 것처럼, SAX 파싱은 책을 페이지별로 읽고, 각 페이지를 이해하는 것입니다. 전체 책을 머릿속에 외우려고 하지 않습니다. 멋진 일 아닙니까?

PHP에서 SAX를 시작하기

PHP는 내장된 XML 파서를 통해 SAX 파싱을 매우 간편하게 만들어줍니다. 간단한 예제를 시작해보겠습니다:

<?php
$parser = xml_parser_create();
xml_parse($parser, "<book><title>PHP for Beginners</title></book>");
xml_parser_free($parser);
?>

이 코드에서 우리는 파서를 생성하고, 간단한 XML 문자열을 파싱한 후, 파서를 해제합니다. 하지만 이것은 아직 많은 것을 하지 않습니다. 우리의 파서를 유용하게 하기 위해서는 XML의 다양한 부분을 만날 때 무엇을 할지 알려줘야 합니다. 그게 우리의 핸들러 함수가 나타나는 부분입니다!

XML 요소 핸들러

xml_set_element_handler() 함수는 파서가 요소의 시작과 끝을 만날 때 무엇을 할지 지정할 수 있게 해줍니다. 그것을 실제로 보겠습니다:

<?php
function start_element($parser, $element_name, $element_attrs) {
    echo "Start Element: $element_name<br>";
}

function end_element($parser, $element_name) {
    echo "End Element: $element_name<br>";
}

$parser = xml_parser_create();
xml_set_element_handler($parser, "start_element", "end_element");

$xml = "<book><title>PHP for Beginners</title><author>John Doe</author></book>";
xml_parse($parser, $xml);
xml_parser_free($parser);
?>

이 스크립트는 다음과 같은 출력을 보여줍니다:

Start Element: BOOK
Start Element: TITLE
End Element: TITLE
Start Element: AUTHOR
End Element: AUTHOR
End Element: BOOK

보시다시피, start_element 함수는 여는 태그를 만날 때 호출되고, end_element 함수는 닫는 태그를 만날 때 호출됩니다.

문자 데이터 핸들러

태그 사이의 텍스트는 어떻게 되는 걸까요? 그게 xml_set_character_data_handler()가 유용한 부분입니다:

<?php
function char_data($parser, $data) {
    echo "Character Data: " . trim($data) . "<br>";
}

$parser = xml_parser_create();
xml_set_character_data_handler($parser, "char_data");

$xml = "<book><title>PHP for Beginners</title><author>John Doe</author></book>";
xml_parse($parser, $xml);
xml_parser_free($parser);
?>

이 스크립트는 다음과 같은 출력을 보여줍니다:

Character Data: PHP for Beginners
Character Data: John Doe

처리 지시 핸들러

때로는 XML 문서에 처리 지시가 포함되어 있습니다. 이는 XML을 처리하는 애플리케이션에 대한 특별한 지시입니다. 이를 처리하기 위해 xml_set_processing_instruction_handler()를 사용할 수 있습니다:

<?php
function pi_handler($parser, $target, $data) {
    echo "Processing Instruction - Target: $target, Data: $data<br>";
}

$parser = xml_parser_create();
xml_set_processing_instruction_handler($parser, "pi_handler");

$xml = "<?xml version='1.0'?><?php echo 'Hello, World!'; ?><root>Some content</root>";
xml_parse($parser, $xml);
xml_parser_free($parser);
?>

이 스크립트는 다음과 같은 출력을 보여줍니다:

Processing Instruction - Target: php, Data: echo 'Hello, World!'

기본 핸들러

마지막으로, xml_set_default_handler()는 다른 핸들러에 의해 처리되지 않은 모든 XML 데이터를 처리할 수 있게 해줍니다:

<?php
function default_handler($parser, $data) {
    echo "Default Handler: " . htmlspecialchars($data) . "<br>";
}

$parser = xml_parser_create();
xml_set_default_handler($parser, "default_handler");

$xml = "<?xml version='1.0'?><root>Some content</root>";
xml_parse($parser, $xml);
xml_parser_free($parser);
?>

이 스크립트는 다음과 같은 출력을 보여줍니다:

Default Handler: <?xml version='1.0'?>
Default Handler: <root>Some content</root>

모든 것을 통합하기

이제 우리는 각 핸들러를 본 적이 있으니, 그들을 더 완전한 예제로 통합해보겠습니다:

<?php
function start_element($parser, $element_name, $element_attrs) {
    echo "Start Element: $element_name<br>";
    if (!empty($element_attrs)) {
        echo "Attributes: ";
        print_r($element_attrs);
        echo "<br>";
    }
}

function end_element($parser, $element_name) {
    echo "End Element: $element_name<br>";
}

function char_data($parser, $data) {
    if (trim($data) !== '') {
        echo "Character Data: " . trim($data) . "<br>";
    }
}

function pi_handler($parser, $target, $data) {
    echo "Processing Instruction - Target: $target, Data: $data<br>";
}

function default_handler($parser, $data) {
    $data = trim($data);
    if (!empty($data)) {
        echo "Default Handler: " . htmlspecialchars($data) . "<br>";
    }
}

$parser = xml_parser_create();

xml_set_element_handler($parser, "start_element", "end_element");
xml_set_character_data_handler($parser, "char_data");
xml_set_processing_instruction_handler($parser, "pi_handler");
xml_set_default_handler($parser, "default_handler");

$xml = <<<XML
<?xml version='1.0'?>
<?php echo 'Hello, World!'; ?>
<library>
    <book id="1">
        <title>PHP for Beginners</title>
        <author>John Doe</author>
    </book>
    <book id="2">
        <title>Advanced PHP Techniques</title>
        <author>Jane Smith</author>
    </book>
</library>
XML;

xml_parse($parser, $xml);
xml_parser_free($parser);
?>

이 종합 예제는 우리가 논의한 모든 핸들러를 보여줍니다. 이를 실행해보고 어떤 출력이 나오는지 확인해보세요!

결론

축하합니다! 지금 PHP의 SAX 파싱 세계로的第一步을 뗐습니다. 기억하시라, 연습은 완벽을 만들어줍니다. 다양한 XML 구조를 실험해보고 파서가 어떻게 처리하는지 확인하지 마세요.

SAX 파싱은 대형 XML 문서를 다루는 데 매우 강력한 도구입니다. 그것은 XML을 효율적으로 처리하고 즉시 처리할 수 있게 해줍니다, 특정 상황에서는 정말로 도움이 될 수 있습니다.

계속 코딩하고, 배우고, 가장 중요한 것은 즐겁게 하세요! 당신이 경험丰富的 pro로 변하기 전까지 시간이 오래 걸리지 않을 것입니다. 다음 번에 만나기 전까지, 행복하게 코딩하세요!

Credits: Image by storyset