PHP 개발에서 특히 비동기 요청 (예 : AJAX 또는 CURL을 사용하여 데이터 비동기 적으로 얻을 때)을 할 때 때때로 XML 형식의 데이터를 수신하고 XML_PARSE 로 구문 분석하려고합니다. 그러나 많은 개발자들은 실제 애플리케이션에서 XML_PARSE가 항상 예상대로 작동하지 않는다는 것을 발견했으며 오류를보고하거나 빈 데이터를 반환 할 수도 있습니다. 그렇다면 왜 이런 일이 일어나고 있습니까?
이 기사는 XML_PARSE를 사용하여 비동기 요청에서 XML 데이터를 처리하기위한 일반적인 문제와 솔루션을 분석합니다.
PHP에서 XML_PARSE는 일반적으로 XML_PARSER_CREATE , XML_SET_ELENMENT_HANDLER 및 XML_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);
동기 환경 에서이 코드는 잘 작동하지만 종종 비동기 호출에서 발생합니다.
비동기 요청은 종종 데이터를 완전히 반환하지 않고 처리를 시작하므로 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);
}
많은 XML 인터페이스는 UTF-8 인코딩 된 컨텐츠를 반환하는 반면 PHP의 기본 내부 인코딩은 UTF-8이 아닐 수 있습니다. 인코딩이 균일하지 않은 경우 XML_PARSE가 오류를보고 할 수 있습니다.
파서를 만들 때 인코딩을 지정하거나 XML 자체가 올바른 인코딩 형식을 선언하는지 확인하십시오.
$parser = xml_parser_create('UTF-8');
또는 먼저 인코딩 및 변환을 수행하십시오.
$data = mb_convert_encoding($data, 'UTF-8', 'auto');
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);
}
}
XML_PARSE 자체는 예외를 제외하지 않으며 부울 값 만 반환하며 XML_GET_ERROR_CODE 및 XML_ERROR_STRING을 통해 오류 메시지를 얻어야합니다. 오류를 불분명하게 처리하면 문제가 쉽게 추적하기 어려울 수 있습니다.
if (!xml_parse($parser, $data, true)) {
error_log("XML Parse Error: " . xml_error_string(xml_get_error_code($parser)));
}
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');
비동기 요청에서 XML 데이터를 사용하여 XML 데이터를 처리 할 때 불완전한 데이터, 인코딩 불일치 및 컨텍스트 상실과 같은 문제가 종종 발생합니다. XML_PARSE가 필요한 경우 데이터 무결성 감지 및 컨텍스트 관리가 강화되어야합니다. 그렇지 않으면 SimpleXML 또는 DomDocument 와 같은 고급 XML 구문 분석 도구를 사용하는 것이 좋습니다.