복잡한 XML 문서를 구문 분석 할 때 네임 스페이스 메커니즘이 중요합니다. 특히 여러 XML 어휘가 혼합 방식으로 사용될 때 요소 이름과 속성 이름 간의 충돌을 효과적으로 피합니다. php에서 xml_set_start_namespace_decl_handler 및 xml_set_end_namespace_decl_handler 함수는 네임 스페이스의 수명주기를 정확하게 제어하는 방법을 제공하고 XML 네임 스페이스의 잘 관리 할 수 있습니다.
XML 네임 스페이스 선언은 일반적으로 요소 시작 태그에 나타납니다.
<root xmlns:h="http://www.w3.org/TR/html4/" xmlns:f="http://www.w3schools.com/furniture">
<h:table>
<h:tr>
<h:td>Apples</h:td>
<h:td>Bananas</h:td>
</h:tr>
</h:table>
<f:table>
<f:name>African Coffee Table</f:name>
<f:width>80</f:width>
<f:length>120</f:length>
</f:table>
</root>
이 예에서는 각각 HTML 및 가구 설명에 각각 정의되고 사용됩니다. 이 구조의 구문 분석이 네임 스페이스 선언을 다루지 않으면 요소를 식별하는 데 어려움이 있습니다.
이 기능은 새 네임 스페이스 선언이 발생할 때 트리거되는 콜백 함수를 등록하는 데 사용됩니다.
bool xml_set_start_namespace_decl_handler ( resource $parser , callable $handler )
콜백 함수는 세 가지 매개 변수를 수락합니다.
$ parser : 파서 리소스;
$ prefix : 네임 스페이스 접두사 (아마도 빈 문자열);
$ URI : 네임 스페이스 우리.
이 함수는 콜백을 등록하고 네임 스페이스 선언 범위의 끝에서 호출됩니다.
bool xml_set_end_namespace_decl_handler ( resource $parser , callable $handler )
콜백 함수는 두 가지 매개 변수를 수락합니다.
$ parser : 파서 리소스;
$ 접두사 : 네임 스페이스 접두사.
다음 예는이 두 기능을 사용하여 XML 네임 스페이스에서 작동하는 방법을 보여줍니다.
<?php
$xml = <<<XML
<root xmlns:h="http://www.w3.org/TR/html4/"
xmlns:f="http://www.w3schools.com/furniture">
<h:table>
<h:tr>
<h:td>Apples</h:td>
<h:td>Bananas</h:td>
</h:tr>
</h:table>
<f:table>
<f:name>African Coffee Table</f:name>
<f:width>80</f:width>
<f:length>120</f:length>
</f:table>
</root>
XML;
$parser = xml_parser_create();
xml_set_start_namespace_decl_handler($parser, function($parser, $prefix, $uri) {
echo "Start Namespace: prefix = {$prefix}, uri = {$uri}\n";
});
xml_set_end_namespace_decl_handler($parser, function($parser, $prefix) {
echo "End Namespace: prefix = {$prefix}\n";
});
xml_set_element_handler($parser,
function($parser, $name, $attrs) {
echo "Start Element: {$name}\n";
},
function($parser, $name) {
echo "End Element: {$name}\n";
}
);
xml_parse($parser, $xml, true);
xml_parser_free($parser);
위의 코드를 실행하면 다음 정보가 출력됩니다.
Start Namespace: prefix = h, uri = http://www.w3.org/TR/html4/
Start Namespace: prefix = f, uri = http://www.w3schools.com/furniture
Start Element: ROOT
Start Element: H:TABLE
Start Element: H:TR
Start Element: H:TD
End Element: H:TD
Start Element: H:TD
End Element: H:TD
End Element: H:TR
End Element: H:TABLE
Start Element: F:TABLE
Start Element: F:NAME
End Element: F:NAME
Start Element: F:WIDTH
End Element: F:WIDTH
Start Element: F:LENGTH
End Element: F:LENGTH
End Element: F:TABLE
End Element: ROOT
End Namespace: prefix = f
End Namespace: prefix = h
네임 스페이스 범위가 시작되거나 끝날 때마다 관련 처리 기능이 트리거되어 개발자가 네임 스페이스에 따라 구문 분석 동작을 기록, 관리 및 동적으로 변경할 수 있음을 알 수 있습니다.
네임 스페이스 컨텍스트 스택 구축 : 프로세싱 함수의 스택 구조를 구축하여 현재 활성화 된 네임 스페이스를 기록하여 XML 노드의 컨텍스트 인식 구문 분석을 용이하게합니다.
혼합 컨텐츠 처리 : XML 문서가 여러 네임 스페이스를 사용하여 중첩을 사용하는 경우 접두사와 URI를 결합하여 이름 충돌을 피하기 위해 요소의 의미를 식별 할 수 있습니다.
확장 성 설계 : SOAP, RSS, Atom 등과 같은 여러 XML 스키마를 지원하는 시스템에는 네임 스페이스 인식 파서 설계가 필수적입니다.
PHP는 xml_set_start_namespace_decl_handler 및 xml_set_end_namespace_decl_handler 함수를 통해 복잡한 네임 스페이스 구조를 처리하기위한 강력한 도구를 제공합니다. 이 두 기능을 유연하게 사용하면 개발자가 호환성이 높고 잘 구조화 된 XML 파서 시스템을 구축 할 수 있으며, 이는 타사 데이터 인터페이스 및 표준 프로토콜 형식을 다루는 데 큰 도움이됩니다.
실제 개발에서 비즈니스 의미와 네임 스페이스 메커니즘을 결합하면 XML 파싱을보다 강력하고 유지 관리 할 수 있습니다. 처리중인 XML이 https://gitbox.net/api/xmlfeed 와 같은 외부 시스템에서 나온 경우, 이러한 기술적 수단이 특히 중요해질 것입니다.