현재 위치: > 최신 기사 목록> xml_parse 예제 xml_set_element_handler와 함께 사용됩니다

xml_parse 예제 xml_set_element_handler와 함께 사용됩니다

M66 2025-05-13

웹 개발을 수행 할 때는 종종 타사 API에서 얻은 데이터 응답과 같은 XML 데이터를 처리하거나 특정 구성 파일을 구문 분석해야합니다. PHP에서 XML_PARSEXML_SET_ELENMEN_HANDLER는 XML 데이터를 처리하는 이벤트 중심의 방법을 제공합니다. 특히 큰 파일 처리 또는 스트리밍 구문 분석에 적합합니다.

이 기사는 실제 사례를 사용 하여이 두 기능을 사용하여 XML 컨텐츠를 구문 분석하고 필요한 데이터를 추출하는 방법을 보여줍니다.

1. 기본 개념 소개

Simplexml , Domdocument , XMLReader 등을 사용하는 등 PHP에서 XML을 처리하는 방법에는 여러 가지가 있지만 XML_PARSE는 SAX (Simple API for XML) 파서라고도하는 이벤트 기반 구문 분석 방법입니다. 이 구문 분석 방법은 전체 XML을 메모리에로드 할 필요가 없기 때문에 대량 볼륨 XML을 처리하는 데 좋습니다.

핵심 기능 :

2. 실제 사례 : 기사 정보 분석

컨텐츠 플랫폼에서 그러한 XML 데이터가 있다고 가정 해 봅시다.

 <?xml version="1.0"?>
<articles>
    <article>
        <title>PHP XML분석 가이드</title>
        <author>리 레이</author>
        <url>https://m66.net/articles/php-xml-guide</url>
    </article>
    <article>
        <title>심층적 인 이해 xml_set_element_handler</title>
        <author>한 메이 메이</author>
        <url>https://m66.net/articles/xml-handler-deepdive</url>
    </article>
</articles>

목표 : 모든 기사의 제목과 링크를 추출하여 배열에 저장하려고합니다.

3. 코드 구현

 <?php

$xmlData = <<<XML
<?xml version="1.0"?>
<articles>
    <article>
        <title>PHP XML분석 가이드</title>
        <author>리 레이</author>
        <url>https://m66.net/articles/php-xml-guide</url>
    </article>
    <article>
        <title>심층적 인 이해 xml_set_element_handler</title>
        <author>한 메이 메이</author>
        <url>https://m66.net/articles/xml-handler-deepdive</url>
    </article>
</articles>
XML;

$parser = xml_parser_create("UTF-8");

$articles = [];
$currentTag = "";
$currentArticle = [];

// 시작 태그 프로세서를 정의하십시오
function startElement($parser, $name, $attrs) {
    global $currentTag;
    $currentTag = strtolower($name);
}

// 엔드 태그 프로세서를 정의하십시오
function endElement($parser, $name) {
    global $currentTag, $currentArticle, $articles;
    
    if (strtolower($name) == 'article') {
        $articles[] = $currentArticle;
        $currentArticle = [];
    }
    $currentTag = "";
}

// 문자 데이터 프로세서를 정의합니다
function characterData($parser, $data) {
    global $currentTag, $currentArticle;

    $data = trim($data);
    if ($data === '') return;

    if (in_array($currentTag, ['title', 'author', 'url'])) {
        $currentArticle[$currentTag] = $data;
    }
}

// 처리 기능 설정
xml_set_element_handler($parser, "startElement", "endElement");
xml_set_character_data_handler($parser, "characterData");

// 구문 분석을 시작하십시오
if (!xml_parse($parser, $xmlData, true)) {
    die(sprintf("XML 실수: %s 에서 %d 좋아요",
        xml_error_string(xml_get_error_code($parser)),
        xml_get_current_line_number($parser)));
}

xml_parser_free($parser);

// 출력 분석 결과
echo "<pre>";
print_r($articles);
echo "</pre>";
?>

4. 출력 결과

 Array
(
    [0] => Array
        (
            [title] => PHP XML분석 가이드
            [author] => 리 레이
            [url] => https://m66.net/articles/php-xml-guide
        )

    [1] => Array
        (
            [title] => 심층적 인 이해 xml_set_element_handler
            [author] => 한 메이 메이
            [url] => https://m66.net/articles/xml-handler-deepdive
        )
)

5. 요약

이 경우 XML_PARSEXML_SET_ELENMEN_HANDLER를 사용하면 필요에 따라 모든 태그와 텍스트 컨텐츠를 처리 할 수 ​​있음을 알 수 있습니다. 이 메소드는 단순한 렉스mL 보다 약간 더 복잡하지만 XML 파일이 매우 크거나 네트워크 스트림에서 나오면 장점이 나타납니다.

다음 시나리오에 적용 가능 :

  • 큰 XML 파일의 메모리에 민감한 처리;

  • 네트워크 스트림의 XML 데이터를 실시간으로 구문 분석합니다.

  • XML 태그의 사용자 지정 정밀 제어가 필요한 시나리오.

복잡한 XML 구조를 다루어야하는 시스템을 구축하는 경우이 색소 소진 방법을 사용해 보는 것이 좋습니다.