현재 위치: > 최신 기사 목록> XML_PARSE는 중첩 태그를 올바르게 처리 할 수 ​​없습니다 : 일반적인 오류 및 솔루션

XML_PARSE는 중첩 태그를 올바르게 처리 할 수 ​​없습니다 : 일반적인 오류 및 솔루션

M66 2025-04-24

PHP를 사용하여 XML 데이터를 처리 할 때 XML_PARSE ()는 PHP의 XML 파서 확장 (국외 거주자 기준)에 속하는 비교적 기본 기능입니다. 그러나 많은 개발자들은 종종 중첩 태그를 구문 분석하는 데 사용할 때 올바르게 처리 할 수없는 상황에 직면합니다. 이 기사는이 문제의 원인에 대한 깊은 이해를 안내하고 실용적인 해결책을 제공 할 것입니다.

1. XML_PARSE의 작업 원칙 소개

XML_PARSE ()는 이벤트 중심 모델을 사용하여 XML 문서를 처리합니다. 파서가 시작 태그, 엔드 태그 또는 문자 데이터를 읽으면 해당 콜백 함수가 호출됩니다.

샘플 초기화 코드는 다음과 같습니다.

 $parser = xml_parser_create();

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

$data = '<book><title>PHP Guide</title><author>John</author></book>';
xml_parse($parser, $data, true);
xml_parser_free($parser);

이 예에서 파서는 STARTELENTED , CATERIALDATAENDELENT 콜백 함수를 차례로 트리거합니다.

2. XML_PARSE가 중첩 태그를 올바르게 처리 할 수없는 이유는 무엇입니까?

주된 이유는 다음과 같습니다.

1. 콜백 함수 처리의 논리가 불완전합니다.

많은 개발자들이 중첩 된 태그를 다룰 때 구문 분석 또는 구조를 올바르게 유지하지 못합니다. XML_PARSE ()가 자동으로 XML 트리 구조를 만드는 데 도움이되지 않으므로 중첩 데이터를 수동으로 빌드해야합니다.

예를 들어 다음 코드가 중첩 노드를 올바르게 처리하지 못합니다.

 function startElement($parser, $name, $attrs) {
    global $currentTag;
    $currentTag = $name;
}

function characterData($parser, $data) {
    global $currentTag;
    echo "$currentTag: $data\n";
}

중첩 태그에서 $ currentTag는 지속적으로 덮어 쓰여서 데이터가 속한 태그를 식별 할 수 없습니다.

2. 스택 구조는 중첩 상태를 저장하는 데 사용되지 않습니다.

중첩 된 XML을 구문 분석하려면 스택을 사용하여 현재 태그 경로를 유지하는 것이 좋습니다.

 $tagStack = [];

function startElement($parser, $name, $attrs) {
    global $tagStack;
    array_push($tagStack, $name);
}

function endElement($parser, $name) {
    global $tagStack;
    array_pop($tagStack);
}

function characterData($parser, $data) {
    global $tagStack;
    $path = implode(' > ', $tagStack);
    echo "[$path] $data\n";
}

이 코드는 예를 들어 중첩 태그의 계층 구조를 더 명확하게 보여줄 수 있습니다.

 <article>
    <header><title>뉴스 제목</title></header>
    <body>내용 섹션</body>
</article>

출력은 다음과 같습니다.

 [ARTICLE > HEADER > TITLE] 뉴스 제목
[ARTICLE > BODY] 내용 섹션

3. 데이터는 잘못 잘라 내거나 불완전합니다

XML_PARSE () 로 전달 된 데이터가 불완전하거나 IS_FINAL 매개 변수 (즉, 마지막 매개 변수)가 사실 인 경우가 맞지 않으면 파싱이 실패하게됩니다.

 xml_parse($parser, $data, true); // 세 번째 매개 변수는이어야합니다 true 데이터가 완료되었음을 나타냅니다

3. 중첩 된 XML을 올바르게 구문 분석하는 방법은 무엇입니까?

가장 권장되는 방법은 다음과 같은 상위 수준의 XML 파서를 사용하는 것입니다.

1. 단순 렉스 미

 $xml = simplexml_load_string('<book><title>PHP Guide</title></book>');
echo $xml->title; // 산출: PHP Guide

2. domdocument

 $doc = new DOMDocument();
$doc->loadXML('<site><url>https://m66.net</url></site>');
$nodes = $doc->getElementsByTagName('url');
echo $nodes->item(0)->nodeValue; // 산출: https://m66.net

이 파서는 당신을 위해 중첩 된 노드 구조를 처리했으며 코드는 명확하고 유지 보수가 더 간단합니다.

4. 요약 및 제안

  • XML_PARSE ()는 이벤트 중심 모델을 사용하며 구조화 된 트리를 자동으로 빌드하지 않으므로 중첩 태그를 수동으로 처리해야합니다.

  • 스택 구조를 사용하여 현재 태그 경로를 추적하는 것이 좋습니다.

  • 프로젝트에서 이벤트 중심 메소드가 구체적으로 필요하지 않은 경우 SimpleXML 또는 DomDocument가 중첩 된 XML을 처리하는 것이 좋습니다.

  • 잘린 데이터의 무결성에주의를 기울이십시오.

XML 파싱은 실제로 복잡하지 않습니다. 핵심은 올바른 도구를 선택하고 그 기본 원리를 이해하는 것입니다. 이 기사가 실제 개발에서 중첩 된 XML 문제를 더 잘 처리하는 데 도움이되기를 바랍니다.