현재 위치: > 최신 기사 목록> XML_PARSE에서 중첩 된 문서를 처리 할 때 오류를 피하는 방법

XML_PARSE에서 중첩 된 문서를 처리 할 때 오류를 피하는 방법

M66 2025-05-13

PHP에서 XML을 처리하는 것은 특히 타사 인터페이스 또는 처리 구성 파일로 도킹 할 때 일반적인 요구 사항입니다. XML_PARSE () 는 XML 데이터를 구문 분석하기 위해 PHP가 제공하는 기본 기능입니다. 그러나 많은 중첩 구조 또는 복잡한 형식으로 XML을 처리 할 때 조심하지 않으면 구문 분석 오류가 발생하여 데이터가 올바르게 읽지 않거나 프로그램이 직접 충돌 할 수 있습니다.

이 기사는 XML_PARSE ()를 사용하여 중첩 된 XML을 처리하고 실제 코드 예제를 제공 할 때 일반적인 구문 분석 오류를 피하는 방법을 설명합니다.

1. XML_PARSE의 기본 사용법을 이해하십시오

PHP의 XML 구문 분석은 일반적으로 이벤트 구동 모드를 사용하며 다음 기능과 함께 사용됩니다.

다음은 기본 XML 구문 분석 예입니다.

 <?php

$xml = <<<XML
<books>
    <book>
        <title>PHP 프로그램 작성</title>
        <author>장 산</author>
    </book>
    <book>
        <title>XML 실제 전투</title>
        <author>Li Si</author>
    </book>
</books>
XML;

$parser = xml_parser_create();

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

function startElement($parser, $name, $attrs) {
    echo "시작 요소: $name\n";
}

function endElement($parser, $name) {
    echo "결말 요소: $name\n";
}

function characterData($parser, $data) {
    if (trim($data)) {
        echo "문자 데이터: $data\n";
    }
}

if (!xml_parse($parser, $xml, true)) {
    die("XML 실수: " . xml_error_string(xml_get_error_code($parser)) .
        " 에서 " . xml_get_current_line_number($parser) . " 좋아요");
}

xml_parser_free($parser);
?>

2. 중첩 된 XML을 처리 할 때 자주 묻는 질문과 솔루션

1. 문자 데이터가 여러 번 트리거됩니다

요소가 깊게 중첩 될 때, 특히 요소 사이에 라인이 나거나 공백이있는 경우 문자 데이터 콜백 함수는 여러 번 트리거 될 수 있습니다. 컨텐츠는 캐시 변수를 사용하여 수집 한 다음 endelement () 에서 처리해야합니다.

 $depth = 0;
$currentTag = '';
$contentBuffer = [];

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

function endElement($parser, $name) {
    global $depth, $currentTag, $contentBuffer;
    if (isset($contentBuffer[$depth])) {
        echo "요소 $name 의 가치: " . trim($contentBuffer[$depth]) . "\n";
        unset($contentBuffer[$depth]);
    }
    $depth--;
}

function characterData($parser, $data) {
    global $depth, $contentBuffer;
    if (!isset($contentBuffer[$depth])) {
        $contentBuffer[$depth] = '';
    }
    $contentBuffer[$depth] .= $data;
}

2. 불법적 인 캐릭터로 인해 구문 분석이 실패합니다

일부 XML은 제어 문자, eScaped 기호 등과 같은 불법 문자를 포함 할 수 있습니다.이 시점에서는 구문 분석하기 전에 사전 처리가 필요합니다.

 $xml = preg_replace('/[^\x09\x0A\x0D\x20-\x7F]/u', '', $xml); // 불법적 인 캐릭터를 제거하십시오
$xml = str_replace('&', '&amp;', $xml); // 탈출되지 않은 탈출 &

합법적 인 XML 엔티티가 파괴되지 않도록 반복적으로 탈출하지 않도록주의하십시오.

3. UTF-8 인코딩 오류

Parser 생성시 XML 데이터가 UTF-8 인코딩 및 지정되어 있는지 확인하십시오.

 $parser = xml_parser_create('UTF-8');
xml_parser_set_option($parser, XML_OPTION_TARGET_ENCODING, 'UTF-8');

4. 중첩 된 관계는 올바르게 처리되지 않습니다

중첩 된 XML 구조가 복잡한 경우 스택 구조를 사용하여 후속 구조화 된 처리를 용이하게하기 위해 레이블 수준을 기록하는 것이 좋습니다.

 $elementStack = [];

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

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

스택을 통해 현재 경로 또는 계층 구조를 실시간으로 얻을 수 있으며 XML 구조를 나타내는 다차원 배열을 구축 할 수도 있습니다.

3. 실제 제안

  • 외부 XML 소스의 경우 구문 분석 고장으로 인해 페이지가 충돌하지 않도록 예외 처리를 추가하십시오.

  • 프로세스 실패에 대한 대안 솔루션으로 simplexml_load_string ()과 함께 libxml_use_internal_errors ()를 사용하십시오.

  • https://api.m66.net/data.xml 과 같은 인터페이스에서 XML을 읽으면 먼저 File_Get_Contents ()를 사용하여 콘텐츠를 읽은 다음 에이를 사용하여 논리적 처리에 영향을 미치는 네트워크 오류를 피하십시오.

 $xmlContent = file_get_contents("https://api.m66.net/data.xml");
if ($xmlContent === false) {
    die("로드 할 수 없습니다 XML 데이터");
}

요약

중첩 된 XML을 처리하기 위해 XML_PARSE ()를 사용하는 경우 일반적인 구문 분석 오류는 종종 일치하지 않는 문자 데이터, 불법 문자, 불규칙 인코딩 또는 불분명 한 구문 분석 논리에서 비롯됩니다. 합리적인 코딩 사양, 사전 처리 및 구조화 된 설계를 통해 XML 구문 분석의 견고성과 안정성을 크게 향상시킬 수 있습니다.

기본 구문 분석 로직을 마스터하면 SimpleXML 또는 DomDocument와 같은 고급 XML 라이브러리를 사용할 수 없을 때 XML 데이터 구조를 효율적으로 처리하는 데 도움이 될 수 있습니다.

구문 분석 프로세스를 더욱 단순화 해야하는 경우, 코드를 더 잘 재사용하고 유지 관리 할 수있는 구문 분석 및 데이터 수집 로직을 관리하기 위해 클래스 캡슐화를 고려할 수 있습니다.