현재 위치: > 최신 기사 목록> xml_set_end_namespace_decl_handler는 XML_SET_START_ELENT_HANDLER와 협력하여 네임 스페이스 관리를 완료합니다

xml_set_end_namespace_decl_handler는 XML_SET_START_ELENT_HANDLER와 협력하여 네임 스페이스 관리를 완료합니다

gitbox 2025-05-26

XML 파싱에서는 네임 스페이스 관리가 매우 중요한 작업입니다. 특히 XML 문서에 여러 네임 스페이스가 포함되어있는 경우 이러한 네임 스페이스를 효율적으로 구문 분석하고 처리하는 방법은 개발자에게 어려운 문제가되었습니다. PHP는 XML_SET_START_ELENMER_HANDLERXML_SET_END_NIMESPACE_DECL_HANDLER 의 두 가지 기능을 제공하므로 XML 문서의 네임 스페이스를 더 잘 처리 할 수 ​​있습니다.

이 기사에서는이 두 기능을 통해 네임 스페이스를 효율적으로 관리하는 방법을 자세히 살펴볼 것입니다.

1. 네임 스페이스 란 무엇입니까?

XML에서 네임 스페이스의 기능은 요소와 속성 이름 사이의 충돌을 피하는 것입니다. 특히 여러 XML 문서가 병합되면 네임 스페이스는 각 요소와 속성이 올바르게 인식되도록합니다. 네임 스페이스는 일반적으로 URI로 표시됩니다.

예를 들어:

 <foo xmlns:ns="http://www.example.com/ns">
  <ns:bar>Some data</ns:bar>
</foo>

여기서 xmlns : ns = "http://www.example.com/ns"는 uri http://www.example.com/ns 와 관련된 네임 스페이스 NS 를 정의하여 NS : BAR 요소가 네임 스페이스에 속하는지 확인합니다.

2. XML_SET_START_ELENMEN_HANDLER 소개 및 XML_SET_END_NAMESPACE_DECL_HANDLER 소개

PHP는 네임 스페이스를 처리하는 데 매우 유용한 두 가지 유용한 XML 구문 분석 기능을 제공합니다.

  • xml_set_start_element_handler :이 함수는 시작 요소를 만나면 호출되며 네임 스페이스 접두사 및 URI의 일치를 처리하는 데 사용할 수 있습니다.

  • xml_set_end_namespace_decl_handler :이 함수는 네임 스페이스 선언을 구문 분석 할 때 호출되므로 네임 스페이스 선언을 관리하는 데 도움이됩니다.

이 두 기능의 조합을 통해 XML의 네임 스페이스를 효율적으로 구문 분석하고 관리 할 수 ​​있습니다.

3. 샘플 코드 : 네임 스페이스를 효율적으로 관리합니다

다음은 xml_set_start_element_handlerxml_set_end_namespace_decl_handler를 사용하여 네임 스페이스를 구문 분석하고 관리하는 샘플 코드입니다. 이 코드는이 두 처리 기능을 통해 여러 네임 스페이스로 XML 파일을 구문 분석하는 방법을 보여줍니다.

 <?php

// XML구문 분석의 시작 및 종료 요소 처리 기능
function startElementHandler($parser, $name, $attrs) {
    // 요소의 네임 스페이스를 얻으십시오
    $namespaceURI = isset($attrs['xmlns']) ? $attrs['xmlns'] : null;
    
    // 요소 이름과 네임 스페이스를 인쇄합니다
    echo "시작 요소:$name\n";
    if ($namespaceURI) {
        echo "네임 스페이스URI:$namespaceURI\n";
    }
}

function endNamespaceDeclHandler($parser, $prefix) {
    echo "结束네임 스페이스:$prefix\n";
}

// 만들다XML파서
$xmlParser = xml_parser_create();

// 设置시작 요소和结束네임 스페이스声明的处理函数
xml_set_element_handler($xmlParser, "startElementHandler", "endElementHandler");
xml_set_end_namespace_decl_handler($xmlParser, "endNamespaceDeclHandler");

// 짐XML데이터
$xmlData = <<<XML
<foo xmlns:ns="http://gitbox.net/ns">
  <ns:bar>Some data</ns:bar>
  <ns:baz>More data</ns:baz>
</foo>
XML;

// 분석XML데이터
if (!xml_parse($xmlParser, $xmlData)) {
    die(sprintf("XML분석错误: %s at line %d",
        xml_error_string(xml_get_error_code($xmlParser)),
        xml_get_current_line_number($xmlParser)));
}

// 释放파서资源
xml_parser_free($xmlParser);
?>

4. 코드 파싱

  1. STARTELEMENTHANDLER : 파서가 시작 요소를 만나면 startElementHandler가 호출됩니다. 속성 배열에서 네임 스페이스 URI를 추출하여 인쇄합니다. 요소에 네임 스페이스 접두사가 있으면 현재 처리 할 수 ​​있습니다.

  2. endnamespacedeclhandler : 파서가 네임 스페이스 선언의 끝을 만나면 endnamespacedeclhandler가 호출됩니다. 여기서는 네임 스페이스의 최종 정보를 관리 할 수 ​​있습니다.

  3. XML_PARSER_CREATE : XML 파서를 생성하고 XML 데이터를 구문 분석 할 준비를합니다.

  4. xml_set_element_handler : startelementhandlerendelementhandler를 파서의 요소 처리 함수로 연결합니다.

  5. XML_SET_END_NAMESPACE_DECL_HANDLER : 네임 스페이스 선언 끝에서 핸들러 기능으로 ENDNAMESPACEDECLHANDLER를 설정합니다.

  6. XML_PARSE : PARSES XML 문자열 및 관련 이벤트 처리 기능이 프로세스 중에 트리거됩니다.

  7. XML_PARSER_FREE : XML 파서 리소스를 릴리스합니다.