PHP에서 XML_PARSE 함수를 사용하여 XML을 구문 분석하는 일반적인 방법이지만 XML 파일에 특수 문자 (예 : & , < , > 또는 불법 UTF-8 문자)가 포함되어 있으면 구문 분석 실패 또는 스크립트 오류를 유발할 수 있습니다. 이 기사는 실제 개발에서 발생하는 몇 가지 일반적인 문제를 탐색하고 특수 문자로 XML을 구문 분석 할 때 일반적인 트랩에 빠지지 않도록 해당 솔루션을 제공합니다.
XML은 문자가 합법적 인 UTF-8 문자 여야합니다. 입력에 불법 문자 (예 : 제어 문자 또는 불법 인코딩)가 포함 된 경우 XML_PARSE는 오류를 직접 반환합니다.
ICONV 또는 MB_CONVERT_ENCODING를 사용하여 컨텐츠를 전처리합니다.
$rawXml = file_get_contents('https://m66.net/data.xml');
$cleanXml = mb_convert_encoding($rawXml, 'UTF-8', 'UTF-8');
또는 정기적으로 사용하여 불법 통제 문자를 지우십시오.
$cleanXml = preg_replace('/[^\x09\x0A\x0D\x20-\x7E\xA0-\xFF]/', '', $rawXml);
XML에서 & & amp; . 원본 XML 문서에 Escaped &가 포함 된 경우 XML_PARSE는 오류를보고합니다.
전처리를 위해 htmlspecialchars 또는 str_replace를 사용할 수 있지만 과도한 탈출을 방지하기 위해주의하십시오.
$cleanXml = str_replace('&', '&', $rawXml);
// 알아채다:이것은 단지 예입니다,그것을 사용할 때는 탈출되었는지 여부를 결정해야합니다.,반복적 인 탈출을 피하십시오
더 안전한 방법은 XML이 합법적인지 확인하는 것입니다.
libxml_use_internal_errors(true);
$xml = simplexml_load_string($rawXml);
if (!$xml) {
foreach (libxml_get_errors() as $error) {
echo "XML Error: " . $error->message;
}
}
XML 파일 헤더가 인코딩을 지정하지 않거나 실제 인코딩과 일치하지 않으면 XML_PARSE 오류가 발생할 수 있습니다.
일관된 인코딩을 보장하기 위해 표준 헤더를 XML로 강제로 강제하십시오.
if (strpos($rawXml, '<?xml') === false) {
$rawXml = '<?xml version="1.0" encoding="UTF-8"?>' . $rawXml;
}
개발자는 때때로 XML_PARSER_FREE를 호출하는 것을 잊어 자원 누출 또는 비정상적인 동작을 초래합니다.
$parser = xml_parser_create('UTF-8');
xml_set_element_handler($parser, 'startElement', 'endElement');
xml_set_character_data_handler($parser, 'characterData');
if (!xml_parse($parser, $cleanXml, 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);
기본적으로 XML_PARSE에서 오류가 발생한 후 예외는 발생하지 않으며 오류 정보를 수동으로 확인해야합니다.
XML_GET_ERROR_CODE () 및 XML_ERROR_STRING () 과 같은 오류 감지 기능을 사용하여 디버깅 효율성을 향상시킵니다.
XML_PARSE 는 근본적이고 잘 수행 된 구문 분석 방법이지만 XML을 사용할 때 XML의 정당성 및 문자 인코딩 문제에 대해 매우주의해야합니다. 구문 분석 실패의 위험을 최소화하기 위해 신뢰할 수 없거나 타사가 제공 한 XML 파일을 처리 할 때 사전 청소, 인코딩 체크섬 오류 감지를 먼저 수행하는 것이 좋습니다.
더 복잡한 XML 구조 및 요구 사항이있는 경우 Domdocument 또는 SimpleXML 과 같은 최신 구문 분석 도구를 사용하는 것을 고려할 수도 있습니다.
관련 태그:
xml_parse