현재 위치: > 최신 기사 목록> fopen과 결합 된 xml_parse를 통해 큰 파일을 구문 분석하는 예

fopen과 결합 된 xml_parse를 통해 큰 파일을 구문 분석하는 예

M66 2025-05-13

XML 파일로 작업 할 때 파일이 매우 큰 경우 (예 : 수백 MB 또는 여러 GB) 전체 파일을 한 번에 메모리에로드하는 것은 비현실적입니다. 현재 PHP의 XML_PARSE 기능을 사용하여 FOPEN 과 스트리밍 읽기를 결합하여 읽기 동안 구문 분석을 실현하여 메모리를 저장할 수 있습니다.

다음은 XML_PARSEFOPEN을 사용하여 큰 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);
?>

설명 :

  1. fopen + fread : fopen을 사용하여 원격 또는 로컬 파일을 열십시오. Fread는 과도한 메모리 사용을 피하기 위해 매번 4096 바이트를 읽습니다.

  2. XML_PARSER_CREATE : XML 파서 리소스를 만듭니다.

  3. xml_set_element_handler : 시작 및 엔드 태그의 처리 기능을 등록하십시오.

  4. XML_SET_CHARACTER_DATA_HANDLER : 문자 데이터를 등록하기위한 처리 함수.

  5. XML_PARSE : 읽기 XML 데이터 블록을 구문 분석하고 여러 통화를 지원하며 스트리밍 처리에 적합합니다.

시나리오 사용 :

  • 대규모 데이터 교환 용 XML 파일

  • 웹 크롤러가 캡처 한 구조화 된 XML 데이터

  • 로깅 시스템 또는 구성 시스템의 XML 기반 배치 분석