웹 개발을 수행 할 때는 종종 타사 API에서 얻은 데이터 응답과 같은 XML 데이터를 처리하거나 특정 구성 파일을 구문 분석해야합니다. PHP에서 XML_PARSE 및 XML_SET_ELENMEN_HANDLER는 XML 데이터를 처리하는 이벤트 중심의 방법을 제공합니다. 특히 큰 파일 처리 또는 스트리밍 구문 분석에 적합합니다.
이 기사는 실제 사례를 사용 하여이 두 기능을 사용하여 XML 컨텐츠를 구문 분석하고 필요한 데이터를 추출하는 방법을 보여줍니다.
Simplexml , Domdocument , XMLReader 등을 사용하는 등 PHP에서 XML을 처리하는 방법에는 여러 가지가 있지만 XML_PARSE는 SAX (Simple API for XML) 파서라고도하는 이벤트 기반 구문 분석 방법입니다. 이 구문 분석 방법은 전체 XML을 메모리에로드 할 필요가 없기 때문에 대량 볼륨 XML을 처리하는 데 좋습니다.
XML_PARSER_CREATE () : XML 파서를 만듭니다.
xml_set_element_handler () : 시작 및 엔드 태그를 처리하는 콜백 함수를 설정합니다.
XML_PARSE () : XML을 구문 분석 시작합니다.
XML_PARSER_FREE () : 릴리스 파서 리소스.
컨텐츠 플랫폼에서 그러한 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>
목표 : 모든 기사의 제목과 링크를 추출하여 배열에 저장하려고합니다.
<?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>";
?>
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
)
)
이 경우 XML_PARSE 및 XML_SET_ELENMEN_HANDLER를 사용하면 필요에 따라 모든 태그와 텍스트 컨텐츠를 처리 할 수 있음을 알 수 있습니다. 이 메소드는 단순한 렉스mL 보다 약간 더 복잡하지만 XML 파일이 매우 크거나 네트워크 스트림에서 나오면 장점이 나타납니다.
다음 시나리오에 적용 가능 :
큰 XML 파일의 메모리에 민감한 처리;
네트워크 스트림의 XML 데이터를 실시간으로 구문 분석합니다.
XML 태그의 사용자 지정 정밀 제어가 필요한 시나리오.
복잡한 XML 구조를 다루어야하는 시스템을 구축하는 경우이 색소 소진 방법을 사용해 보는 것이 좋습니다.