웹 개발을 수행 할 때는 종종 타사 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 구조를 다루어야하는 시스템을 구축하는 경우이 색소 소진 방법을 사용해 보는 것이 좋습니다.
관련 태그:
xml_parse