현재 위치: > 최신 기사 목록> 비동기 요청에서 XML_PARSE를 사용하여 XML 데이터를 처리하는 것에 대한 자주 묻는 질문

비동기 요청에서 XML_PARSE를 사용하여 XML 데이터를 처리하는 것에 대한 자주 묻는 질문

M66 2025-05-12

PHP 개발에서 특히 비동기 요청 (예 : AJAX 또는 CURL을 사용하여 데이터 비동기 적으로 얻을 때)을 할 때 때때로 XML 형식의 데이터를 수신하고 XML_PARSE 로 구문 분석하려고합니다. 그러나 많은 개발자들은 실제 애플리케이션에서 XML_PARSE가 항상 예상대로 작동하지 않는다는 것을 발견했으며 오류를보고하거나 빈 데이터를 반환 할 수도 있습니다. 그렇다면 왜 이런 일이 일어나고 있습니까?

이 기사는 XML_PARSE를 사용하여 비동기 요청에서 XML 데이터를 처리하기위한 일반적인 문제와 솔루션을 분석합니다.

1. XML_PARSE의 기본 사용법 검토

PHP에서 XML_PARSE는 일반적으로 XML_PARSER_CREATE , XML_SET_ELENMENT_HANDLERXML_PARSE 자체와 함께 사용되는 이벤트 기반 구문 분석을 통해 XML을 처리합니다. 예를 들어:

 $xml_parser = xml_parser_create();

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

$data = file_get_contents("https://m66.net/api/data.xml");

if (!xml_parse($xml_parser, $data, true)) {
    die(sprintf("XML Error: %s at line %d",
        xml_error_string(xml_get_error_code($xml_parser)),
        xml_get_current_line_number($xml_parser)));
}

xml_parser_free($xml_parser);

동기 환경 에서이 코드는 잘 작동하지만 종종 비동기 호출에서 발생합니다.

2. 비동기 요청의 일반적인 문제

1. XML 데이터는 완전히 반환되지 않았습니다

비동기 요청은 종종 데이터를 완전히 반환하지 않고 처리를 시작하므로 XML 문자열이 XML_Parse 에 전달되는 XML 문자열이 불완전하고 구문 분석 실패를 유발합니다.

해결책:

비동기 응답을 처리 할 때는 데이터 무결성을 보장하고 콜백 함수 사용과 같은 필요한 경우 캐시 또는 처리 메커니즘을 사용하십시오.

 function onXmlDataReceived($data) {
    if (strpos($data, '</root>') === false) {
        // XML 아마도 완전히 돌아 오지 않았을 수도 있습니다
        return;
    }
    
    $parser = xml_parser_create();
    xml_parse($parser, $data, true);
    xml_parser_free($parser);
}

2. 캐릭터 인코딩은 일관성이 없습니다

많은 XML 인터페이스는 UTF-8 인코딩 된 컨텐츠를 반환하는 반면 PHP의 기본 내부 인코딩은 UTF-8이 아닐 수 있습니다. 인코딩이 균일하지 않은 경우 XML_PARSE가 오류를보고 할 수 있습니다.

해결책:

파서를 만들 때 인코딩을 지정하거나 XML 자체가 올바른 인코딩 형식을 선언하는지 확인하십시오.

 $parser = xml_parser_create('UTF-8');

또는 먼저 인코딩 및 변환을 수행하십시오.

 $data = mb_convert_encoding($data, 'UTF-8', 'auto');

3. 비동기 콜백에서 컨텍스트가 손실되었습니다

CURL을 사용한 멀티 스레딩 (CURL_MULTI_* 기능 패밀리)과 같은 비동기 요청에서 필요한 파서 또는 컨텍스트 정보가 콜백 함수에서 전달되는 것을 잊어 버려 XML_PARSE가 제대로 작동하지 않을 수 있습니다.

예제 오류 쓰기 :

 curl_multi_add_handle($mh, $ch);

// 콜백에서 파서 또는 기타 컨텍스트를 전달하는 것을 잊었습니다.

국가 관리를 캡슐화하는 올바른 방법 :

 class XmlParserContext {
    public $parser;
    public $data = '';

    public function __construct() {
        $this->parser = xml_parser_create();
        xml_set_element_handler($this->parser, "startElement", "endElement");
        xml_set_character_data_handler($this->parser, "characterData");
    }

    public function parse() {
        xml_parse($this->parser, $this->data, true);
        xml_parser_free($this->parser);
    }
}

4. 오류 처리는 불분명합니다

XML_PARSE 자체는 예외를 제외하지 않으며 부울 값 만 반환하며 XML_GET_ERROR_CODEXML_ERROR_STRING을 통해 오류 메시지를 얻어야합니다. 오류를 불분명하게 처리하면 문제가 쉽게 추적하기 어려울 수 있습니다.

명확한 오류 로그를 추가하는 것이 좋습니다.

 if (!xml_parse($parser, $data, true)) {
    error_log("XML Parse Error: " . xml_error_string(xml_get_error_code($parser)));
}

3. SimpleXML 또는 Dom을 사용하여 교체하십시오

XML_PARSE는 하단에서 XML을 처리하는 전형적인 방법이지만 비동기 요청에 SimpleXML 또는 DomDocument를 사용하는 것보다 강력하고 간결 할 수 있습니다.

 $xml = simplexml_load_string($data);

foreach ($xml->item as $item) {
    echo $item->title;
}

또는:

 $dom = new DOMDocument();
$dom->loadXML($data);
$items = $dom->getElementsByTagName('item');

4. 결론

비동기 요청에서 XML 데이터를 사용하여 XML 데이터를 처리 할 때 불완전한 데이터, 인코딩 불일치 및 컨텍스트 상실과 같은 문제가 종종 발생합니다. XML_PARSE가 필요한 경우 데이터 무결성 감지 및 컨텍스트 관리가 강화되어야합니다. 그렇지 않으면 SimpleXML 또는 DomDocument 와 같은 고급 XML 구문 분석 도구를 사용하는 것이 좋습니다.