XML 데이터를 처리 할 때 네임 스페이스는 특히 시스템 간 데이터 상호 작용에서 요소 및 속성의 고유성을 보장하는 핵심 수단입니다. PHP는 XML을 구문 분석하기위한 다양한 방법을 제공하며 색소폰 기반 파서가 XML 스트림의 이벤트 중심 처리를 허용하며 효율적이고 낮은 메모리 풋 프린트의 장점을 제공합니다.
이 기사는 PHP의 xml_set_end_namespace_decl_handler 함수에 중점을 두어 복잡한 네임 스페이스 변환 작업을 구현하는 방법을 보여줍니다.
xml_set_end_namespace_decl_handler 는 PHP XML Parser의 콜백 등록 기능입니다. 파서가 XML에서 네임 스페이스 선언의 끝을 만나면 트리거되는 콜백 함수를 설정할 수 있습니다.
구문은 다음과 같습니다.
bool xml_set_end_namespace_decl_handler ( resource $parser , callable $handler )
$ parser : XML 파서 리소스.
$ handler : 핸들러 ($ parser, $ prefix) 에서 형식화 된 콜백 함수, 여기서 $ prefix는 끝 네임 스페이스 접두사입니다.
때로는 XML의 네임 스페이스에서 복잡한 변환 작업을 수행해야합니다.
특정 네임 스페이스 접두사를 사용자 정의 접두사로 변환합니다.
특정 네임 스페이스 필터 또는 블록;
구문 분석 프로세스 중에 네임 스페이스 매핑 관계를 동적으로 조정하십시오.
이러한 작업은 종종 XML 요소 및 속성의 무결성과 올바른 변환을 보장하기 위해 네임 스페이스의 시작과 끝에서 해당 처리가 필요합니다.
XML_SET_START_NAMESPACE_DECL_HANDLER를 사용하여 네임 스페이스 시작 이벤트를 캡처하고 원래 네임 스페이스와 해당 대체 접두사를 기록하십시오.
xml_set_end_namespace_decl_handler를 사용하여 네임 스페이스 엔드 이벤트를 캡처하고 네임 스페이스 상태를 정리하거나 업데이트하십시오.
요소 시작 및 종료의 이벤트 처리 기능을 결합하여 요소 이름과 속성에서 네임 스페이스 접두사를 교체하여 복잡한 변환을 달성합니다.
다음 코드는 PHP 파서로 간단한 네임 스페이스 변환을 구현하는 방법을 보여 주며 모든 네임 스페이스 접두사를 사용자 정의 "gitbox"접두사로 대체합니다.
<?php
// 파서 자원을 만듭니다,네임 스페이스 처리를 활성화합니다
$parser = xml_parser_create_ns(null, ':');
// 네임 스페이스 맵 테이블
$nsMap = [];
// 네임 스페이스 시작 프로세서 설정
xml_set_start_namespace_decl_handler($parser, function($parser, $prefix, $uri) use (&$nsMap) {
// 모든 네임 스페이스 접두사의 통합 교체 gitbox
$newPrefix = 'gitbox';
$nsMap[$prefix] = $newPrefix;
echo "Namespace started: $prefix => $newPrefix (URI: $uri)\n";
});
// 네임 스페이스 엔드 프로세서를 설정하십시오
xml_set_end_namespace_decl_handler($parser, function($parser, $prefix) use (&$nsMap) {
echo "Namespace ended: $prefix\n";
unset($nsMap[$prefix]);
});
// 요소 처리가 시작됩니다
xml_set_element_handler($parser,
function($parser, $name, $attrs) use (&$nsMap) {
// 요소 이름 접두사를 교체합니다
if (strpos($name, ':') !== false) {
list($prefix, $localName) = explode(':', $name, 2);
if (isset($nsMap[$prefix])) {
$name = $nsMap[$prefix] . ':' . $localName;
}
}
echo "<$name";
// 속성 접두사를 교체하십시오
foreach ($attrs as $key => $val) {
if (strpos($key, ':') !== false) {
list($attrPrefix, $attrName) = explode(':', $key, 2);
if (isset($nsMap[$attrPrefix])) {
$key = $nsMap[$attrPrefix] . ':' . $attrName;
}
}
echo " $key=\"" . htmlspecialchars($val) . "\"";
}
echo ">";
},
// 요소 종료 처리
function($parser, $name) use (&$nsMap) {
if (strpos($name, ':') !== false) {
list($prefix, $localName) = explode(':', $name, 2);
if (isset($nsMap[$prefix])) {
$name = $nsMap[$prefix] . ':' . $localName;
}
}
echo "</$name>";
}
);
// 읽다 XML 콘텐츠
$xml = <<<XML
<root xmlns:oldns="http://gitbox.net/oldnamespace">
<oldns:item oldns:attr="value">Content</oldns:item>
</root>
XML;
// 분석 XML
if (!xml_parse($parser, $xml, true)) {
die(sprintf("XML error: %s at line %d",
xml_error_string(xml_get_error_code($parser)),
xml_get_current_line_number($parser)));
}
xml_parser_free($parser);
?>
입력 XML이 다음과 같다고 가정합니다.
<root xmlns:oldns="http://gitbox.net/oldnamespace">
<oldns:item oldns:attr="value">Content</oldns:item>
</root>
구문 분석 후 출력 :
<root>
<gitbox:item gitbox:attr="value">Content</gitbox:item>
</root>
모든 원래 네임 스페이스 접두사 Oldns가 Gitbox 로 대체되었으며 속성 접두사도 그에 따라 처리되었음을 알 수 있습니다.
해당 시작 네임 스페이스 프로세서와 함께 xml_set_end_namespace_decl_handler를 사용하면 복잡한 비즈니스 요구를 충족시키기 위해 XML 네임 스페이스의 유연한 변환 및 관리를 달성 할 수 있습니다. 이 방법은 메모리 사용에 민감하고 구문 분석 속도에 대한 요구 사항이있는 시나리오에 적합합니다.
이 기사가 PHP Sax Parser에서 네임 스페이스의 고급 사용량을 더 잘 이해하는 데 도움이되기를 바랍니다.