현재 위치: > 최신 기사 목록> XML 파싱을 위해 XML_SET_CHARACTER_DATA_HANDLER 및 XML_SET_END_NAMESPACE_DECL_HANDLER를 결합하는 방법?

XML 파싱을 위해 XML_SET_CHARACTER_DATA_HANDLER 및 XML_SET_END_NAMESPACE_DECL_HANDLER를 결합하는 방법?

gitbox 2025-05-26

PHP에서 XML을 구문 분석 할 때 XML_SET_CHARACTER_DATA_HANDLERXML_SET_END_NAMESPACE_DECL_HANDLER 는 다른 구문 분석 이벤트를 처리하는 데 일반적으로 사용되는 두 개의 콜백 기능입니다. 복잡한 XML 문서 파서를 구축하는 데 어떻게 작동하는지와 함께 사용되는 방법을 이해하는 것이 중요합니다.

1. 기본 개념의 검토

  • XML_SET_CHARACTER_DATA_HANDLER () : 파서가 문자 데이터 (즉, 라벨 간 텍스트)를 만나면 호출 할 콜백 함수를 지정하는 데 사용됩니다.

  • xml_set_end_namespace_decl_handler () : 네임 스페이스가 선언을 종료 할 때 호출 할 콜백 함수를 지정하는 데 사용됩니다. 이는 네임 스페이스로 XML 문서를 처리하는 데 특히 중요합니다.

이 두 프로세서는 각각 텍스트 내용과 네임 스페이스의 구조적 경계를 처리 할 수 ​​있습니다. 이를 사용하면 XML 컨텐츠를 네임 스페이스로 구문 분석 할 때 명확한 구조 및 정확한 데이터 구문 분석 로직을 달성 할 수 있습니다.

2. 실제 예 : 두 개의 프로세서를 조합하여 사용하십시오

다음은 파서를 생성하고 동시에 두 프로세서를 설정하는 방법을 보여주는 구체적인 예입니다.

 <?php
// 시뮬레이션 XML 콘텐츠
$xmlData = <<<XML
<root xmlns:ns="http://gitbox.net/ns">
    <ns:item>이것은 네임 스페이스가있는 프로젝트입니다</ns:item>
</root>
XML;

// 파서를 만듭니다
$parser = xml_parser_create_ns("UTF-8", ":");

// 문자 데이터 프로세서 설정
xml_set_character_data_handler($parser, function($parser, $data) {
    // 공백 문자를 제거하십시오
    $data = trim($data);
    if (!empty($data)) {
        echo "문자 데이터: " . $data . PHP_EOL;
    }
});

// 네임 스페이스 엔드 프로세서를 설정하십시오
xml_set_end_namespace_decl_handler($parser, function($parser, $prefix) {
    echo "네임 스페이스의 끝: " . ($prefix ?: "[기본]") . PHP_EOL;
});

// 设置기본处理器,경고를 피하십시오
xml_set_element_handler($parser, function(){}, function(){});

// 구문 분석을 시작하십시오
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);
?>

출력 결과 :

 문자 데이터: 이것은 네임 스페이스가있는 프로젝트입니다
네임 스페이스의 끝: ns

3. 분석 프로세스 설명

위 코드에서 :

  1. XML_PARSER_CREATE_NS를 사용하여 네임 스페이스 지원 파서를 만듭니다.

  2. 두 개의 프로세서가 등록되었습니다.

    • 문자 데이터 프로세서는 <ns : item> 에서 "이것은 네임 스페이스가있는 프로젝트"텍스트를 만나면 발사됩니다.

    • 파서가 읽을 때 네임 스페이스 엔드 프로세서가 발사되고 </ns : item>을 읽고 NS 네임 스페이스의 끝을 인식합니다.

  3. XML_PARSE를 사용하여 XML 문자열을 구문 분석하십시오.

  4. XML_PARSER_FREE를 사용하여 마지막에 파서 리소스를 해제하십시오.

4. 결합 된 사용의 중요성

이 두 프로세서를 조합하여 사용하면 다음을 수행 할 수 있습니다.

  • 네임 스페이스의 수명주기를 더 잘 추적하고 처리합니다.

  • 중첩 네임 스페이스가 포함 된 XML 문서로 작업 할 때 명확한 컨텍스트 구조를 유지하십시오.

  • 유효한 정보를 추출하고 XML 구조와 일치하는 유연성.

이는 프로토콜 및 비누, RSS 또는 XML 네임 스페이스와 같은 형식을 처리하는 데 특히 중요합니다.

5. 실제 응용 프로그램 제안

대규모 프로젝트에서 각 프로세서는 클래스 메소드로 캡슐화되어 클로저를 통해 컨텍스트 상태를 결합하여 코드의 유지 관리 및 가독성을 향상시킬 수 있습니다. 동시에 프로세서 내부의 상태 레코드 (예 : 현재 노드, 네임 스페이스 스택 등)를 사용하면 복잡한 XML의 구문 분석 기능이 향상 될 수 있습니다.

XML_SET_CHARACTER_DATA_HANDLERXML_SET_END_NAMESPACE_DECL_HANDLER 를 합리적으로 결합하면 네임 스페이스로 XML 데이터 구문 분석 요구를 쉽게 처리하기 위해보다 강력한 XML 구문 분석 로직을 구축 할 수 있습니다.