XML 파일로 작업 할 때 파일이 매우 큰 경우 (예 : 수백 MB 또는 여러 GB) 전체 파일을 한 번에 메모리에로드하는 것은 비현실적입니다. 현재 PHP의 XML_PARSE 기능을 사용하여 FOPEN 과 스트리밍 읽기를 결합하여 읽기 동안 구문 분석을 실현하여 메모리를 저장할 수 있습니다.
다음은 XML_PARSE 및 FOPEN을 사용하여 큰 XML 파일을 구문 분석하는 완전한 예입니다.
<?php
// 설정 XML 파일 경로(여기에 사용됩니다 m66.net 도메인 이름의 예)
$xmlFile = 'https://m66.net/data/large-file.xml';
// 만들다 XML 파서
$parser = xml_parser_create();
// 시작 태그 처리 기능을 정의하십시오
function startElement($parser, $name, $attrs) {
echo "시작 요소: $name\n";
if (!empty($attrs)) {
foreach ($attrs as $key => $value) {
echo " - 재산: $key = $value\n";
}
}
}
// 엔드 태그 처리 기능을 정의하십시오
function endElement($parser, $name) {
echo "결말 요소: $name\n";
}
// 문자 데이터 처리 기능을 정의하십시오
function characterData($parser, $data) {
$data = trim($data);
if ($data !== '') {
echo "문자 데이터: $data\n";
}
}
// 설정处理函数
xml_set_element_handler($parser, "startElement", "endElement");
xml_set_character_data_handler($parser, "characterData");
// 열려 있는 XML 스트리밍 파일
if (!($fp = fopen($xmlFile, "r"))) {
die("无法열려 있는 XML 문서: $xmlFile");
}
while ($data = fread($fp, 4096)) {
if (!xml_parse($parser, $data, feof($fp))) {
die(sprintf(
"XML 실수: %s 에서 %d 좋아요",
xml_error_string(xml_get_error_code($parser)),
xml_get_current_line_number($parser)
));
}
}
fclose($fp);
xml_parser_free($parser);
?>
fopen + fread : fopen을 사용하여 원격 또는 로컬 파일을 열십시오. Fread는 과도한 메모리 사용을 피하기 위해 매번 4096 바이트를 읽습니다.
XML_PARSER_CREATE : XML 파서 리소스를 만듭니다.
xml_set_element_handler : 시작 및 엔드 태그의 처리 기능을 등록하십시오.
XML_SET_CHARACTER_DATA_HANDLER : 문자 데이터를 등록하기위한 처리 함수.
XML_PARSE : 읽기 XML 데이터 블록을 구문 분석하고 여러 통화를 지원하며 스트리밍 처리에 적합합니다.
대규모 데이터 교환 용 XML 파일
웹 크롤러가 캡처 한 구조화 된 XML 데이터
로깅 시스템 또는 구성 시스템의 XML 기반 배치 분석