현재 위치: > 최신 기사 목록> XML_PARSER_CREATE_NS 복잡한 XML 네임 스페이스 구조를 처리하는 방법

XML_PARSER_CREATE_NS 복잡한 XML 네임 스페이스 구조를 처리하는 방법

gitbox 2025-05-28

XML 데이터로 작업 할 때는 멀티 레이어 중첩 및 복잡한 네임 스페이스 구조를 만나는 것이 매우 일반적입니다. PHP는 XML_PARSER_CREATE_NS가 네임 스페이스 구문 분석을 지원하도록 특별히 설계된 강력한 XML 구문 분석 도구를 제공합니다. 이 기사는 XML_PARSER_CREATE_NS를 사용하여 복잡한 XML 구조를 처리하는 방법을 자세히 설명하여 네임 스페이스로 다층 중첩 XML 데이터를 효율적이고 정확하게 처리 할 수 ​​있습니다.


xml_parser_create_ns 란 무엇입니까?

XML_PARSER_CREATE_NS는 네임 스페이스를 지원하는 XML 파서를 만드는 PHP 함수입니다. 일반적인 XML_PARSER_CREATE 와 비교하여 XML의 다른 네임 스페이스에서 태그를 식별하고 구별 할 수 있으므로 복잡한 XML 파일을 처리 할 때 개발자가보다 유연하고 정확할 수 있습니다.

구문은 다음과 같습니다.

 $parser = xml_parser_create_ns(string $encoding = "UTF-8", string $separator = ":");
  • $ 인코딩 : 구문 분석 된 문자 인코딩, 기본값은 UTF-8로 지정됩니다.

  • $ 분리기 : 네임 스페이스가있는 태그로 구문 분석 할 때 네임 스페이스와 레이블 이름을 분리하는 데 사용되는 문자, 기본값은 콜론으로 표시됩니다 .


다층 둥지 및 복잡한 네임 스페이스 구조를 다루는 아이디어

  1. 네임 스페이스 지원 파서를 만듭니다 <br> XML_PARSER_CREATE_NS를 사용하여 적절한 분리기를 지정하는 파서를 만듭니다.

  2. 처리 기능을 등록하십시오 <br> 시작 태그, 엔드 태그 및 태그 컨텐츠를 처리하는 콜백 함수는 xml_set_element_handlerxml_set_character_data_handler 를 통해 등록됩니다.

  3. 스택 구조 추적 중첩 레벨을 유지하십시오 <br> XML은 여러 레이어 중첩 될 수 있으므로 스택을 사용하여 현재 레벨 및 태그 경로를 추적해야합니다.

  4. 네임 스페이스 접두사 및 태그 이름을 해결하십시오 . <br> 파서는 쉽게 구별 할 수 있도록 $ 분리기가 있는 네임 스페이스로 레이블 이름을 자동으로 분리합니다.

  5. 데이터 처리 <br> 데이터는 콜백 함수에서 처리되어 네임 스페이스 및 태그 이름과 함께 필요한 구조로 저장 또는 변환됩니다.


샘플 코드 : 복잡한 네임 스페이스 XML을 구문 분석합니다

다층 중첩 및 네임 스페이스가 포함 된 다음 XML이 있다고 가정합니다.

 <ns1:root xmlns:ns1="http://example.com/ns1" xmlns:ns2="http://example.com/ns2">
  <ns1:parent>
    <ns2:child>Content A</ns2:child>
    <ns2:child>
      <ns1:grandchild>Content B</ns1:grandchild>
    </ns2:child>
  </ns1:parent>
</ns1:root>

PHP 구문 분석 예 :

 <?php
$xml = <<<XML
<ns1:root xmlns:ns1="http://example.com/ns1" xmlns:ns2="http://example.com/ns2">
  <ns1:parent>
    <ns2:child>Content A</ns2:child>
    <ns2:child>
      <ns1:grandchild>Content B</ns1:grandchild>
    </ns2:child>
  </ns1:parent>
</ns1:root>
XML;

$parser = xml_parser_create_ns("UTF-8", ":");
xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, false);

$stack = [];
$current_data = '';

function startElement($parser, $name, $attrs) {
    global $stack, $current_data;
    // 새로운 요소가 발생했을 때,먼저 이전 데이터를 지우십시오
    $current_data = '';
    // 요소 이름과 속성을 스택에 푸시하십시오,쉬운 유지 보수 수준
    $stack[] = ['name' => $name, 'attrs' => $attrs];
}

function endElement($parser, $name) {
    global $stack, $current_data;
    // 스택에서,현재 요소 정보를 얻으십시오
    $element = array_pop($stack);
    // 현재 요소의 네임 스페이스와 이름을 출력하십시오,그리고 내용
    echo "Tag: {$element['name']}, Content: " . trim($current_data) . "\n";
    // Clear Current 데이터,다음 요소를 처리 할 준비를하십시오
    $current_data = '';
}

function characterData($parser, $data) {
    global $current_data;
    $current_data .= $data;
}

xml_set_element_handler($parser, "startElement", "endElement");
xml_set_character_data_handler($parser, "characterData");

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);
?>

분석 결과 설명

위 코드를 실행 한 후 출력은 다음과 같습니다.

 Tag: ns2:child, Content: Content A
Tag: ns1:grandchild, Content: Content B
Tag: ns2:child, Content:
Tag: ns1:parent, Content:
Tag: ns1:root, Content:

출력에서 다음을 볼 수 있습니다.

  • 태그 이름에는 콜론으로 분리 된 네임 스페이스 접두사와 이름이 포함되어 있습니다 .

  • 내용은 해당 태그와 올바르게 일치합니다.

  • 스택 메커니즘은 올바른 계층 적 처리를 보장하고 복잡한 중첩 구조를 정확하게 구문 분석 할 수 있습니다.


요약 및 기술

  • 일반 파서 대신 xml_parser_create_ns를 사용하면 네임 스페이스를 더 잘 지원할 수 있습니다.

  • 스택 구조를 합리적으로 설계함으로써, 어떤 깊이에서 둥지를 돌릴 수 있습니다.

  • $ 분리기를 사용하여 네임 스페이스 접두사의 식별을 용이하게하여 후속 처리를 용이하게합니다.

  • 오류 처리 메커니즘과 결합하여 프로그램 견고성을 향상시킵니다.

이 구문 분석 방법은 웹 서비스, 구성 파일 구문 분석 등 XML의 구조 및 네임 스페이스에 대한 엄격한 요구 사항이있는 시나리오에 적합합니다.


구문 분석 결과를 배열 또는 객체로 변환하는 것과 같은 구문 분석 결과를 추가로 변환 해야하는 경우 콜백 함수에 해당 처리 로직을 추가하여 PHP의 유연성을 완전히 재생할 수도 있습니다.

이 공유가 복잡한 네임 스페이스 및 다층 중첩 XML 구문 분석 문제를 더 잘 처리하는 데 도움이되기를 바랍니다.