PHP에서 XML 데이터를 처리 할 때 다양한 파서 기능이 종종 필요하며 그 중 XML_SET_END_NAMESPACE_DECL_HANDLER는 네임 스페이스 엔드 선언 프로세서를 설정하는 데 특별히 사용되는 기능입니다. 이 기사는 매개 변수에 대한 깊은 이해를 안내하고보다 효율적으로 사용하는 데 도움이되는 실용적인 팁을 제공합니다.
xml_set_end_namespace_decl_handler 의 정의는 다음과 같습니다.
bool xml_set_end_namespace_decl_handler(XMLParser $parser, callable $handler)
이 기능은 지정된 XML Parser $ Parser에 대한 콜백 함수 $ 핸들러를 등록하는 것입니다. 이는 네임 스페이스가 선언을 종료 할 때 호출됩니다.
다시 말해 , 파서가 네임 스페이스의 범위가 끝나는 것을 감지하면 PHP는 지정한 $ 처리기를 자동으로 호출합니다.
두 매개 변수의 의미와 사용법을 자세히 살펴 보겠습니다.
? $ parser
이것은 xml_parser_create () 를 통해 생성 된 파서 인스턴스입니다. 예를 들어:
$parser = xml_parser_create();
당신이 통과하는 것이 유효한 파서 자원인지 확인해야합니다. 그렇지 않으면 함수가 false를 반환합니다.
? $ 핸들러
이것은 다음과 같이 형식으로 정의한 콜백 함수입니다.
function handlerFunction(XMLParser $parser, string $prefix) {
// 처리 로직
}
$ parser : 현재 파서 인스턴스를 전달하십시오.
$ 접두사 : 엔딩 네임 스페이스 접두사. 기본 네임 스페이스가 끝나면 값은 빈 문자열 "" 입니다.
예:
function endNsHandler($parser, $prefix) {
echo "네임 스페이스의 끝:$prefix\n";
}
그런 다음 다음 코드로 바인딩합니다.
xml_set_end_namespace_decl_handler($parser, 'endNsHandler');
?? 팁 1 : 콜백 서명을 확인하십시오
$ 핸들러가 올바른 숫자와 매개 변수 순서를 정의해야합니다. 매개 변수가 잘못되면 PHP는 런타임에 오류를보고합니다.
?? 팁 2 : 시작 프로세서와 결합
일반적으로 네임 스페이스의 시작 선언을 처리하기 위해 XML_SET_START_NAMESPACE_DECL_HANDLER ()를 동시에 사용합니다. 이를 통해 네임 스페이스의 수명주기를 완전히 추적 할 수 있습니다.
function startNsHandler($parser, $prefix, $uri) {
echo "네임 스페이스가 시작됩니다:$prefix ($uri)\n";
}
xml_set_start_namespace_decl_handler($parser, 'startNsHandler');
?? 팁 3 : 기본 네임 스페이스를 처리합니다
$ prefix가 빈 문자열 일 때 무시하지 마십시오. 기본 네임 스페이스의 끝을 나타냅니다. 조건부 판단을 사용하여 구체적으로 처리 할 수 있습니다.
if ($prefix === '') {
echo "默认네임 스페이스의 끝\n";
} else {
echo "네임 스페이스 $prefix 마치다\n";
}
?? 팁 4 : 출력 디버깅
XML 파싱을 디버그하려면 $ 핸들러 에 세부 로그를 추가하거나 파일에 정보를 작성할 수 있습니다. 예를 들어:
file_put_contents('log.txt', "네임 스페이스의 끝:$prefix\n", FILE_APPEND);
?? 팁 5 : URL을 처리 할 때주의하십시오
예를 들어 XML에 URL이 포함 된 경우
<example xmlns:git="http://gitbox.net/ns">
이러한 URL을 처리 할 때는 XSS 또는 기타 주입 문제를 피하기 위해 출력을 피해야합니다. 예를 들어:
$safeUrl = htmlspecialchars($uri, ENT_QUOTES, 'UTF-8');
다음은 네임 스페이스의 시작과 끝을 처리하고 관련 정보를 출력하는 완전한 사용 예입니다.
<?php
$parser = xml_parser_create();
function startNsHandler($parser, $prefix, $uri) {
echo "네임 스페이스가 시작됩니다:$prefix ($uri)\n";
}
function endNsHandler($parser, $prefix) {
echo "네임 스페이스의 끝:$prefix\n";
}
xml_set_start_namespace_decl_handler($parser, 'startNsHandler');
xml_set_end_namespace_decl_handler($parser, 'endNsHandler');
$xml = <<<XML
<example xmlns:git="http://gitbox.net/ns">
<git:child>콘텐츠</git:child>
</example>
XML;
xml_parse($parser, $xml, true);
xml_parser_free($parser);
?>
이 예에서 <git : child> tag를 구문 분석 할 때 시작 네임 스페이스 프로세서가 발사되고 </git : child> 의 끝에서 끝 네임 스페이스 프로세서가 호출됩니다.