PHP의 simplexml_load_string 함수를 사용하여 XML 문자열을 구문 분석 할 때, 구문 분석 실패를 일으키는 "불법 문자"문제가 종종 발생합니다. 이러한 유형의 오류는 일반적으로 XML 문자열에 문자가 존재하는 것으로부터 XML 사양, 예를 들어 컨트롤 문자, 에스카로운 특수 기호 또는 일관성이없는 인코딩 형식과 같은 문자가 비롯됩니다. 이 기사는 문제를 일으키는 원인에 대한 자세한 설명을 제공하고 솔루션 및 샘플 코드를 제공합니다.
simplexml_load_string 은 XML 문자열을 구문 분석하기 위해 PHP가 사용하는 단순한 기능입니다. XML 문자열에 불법 문자가 포함 된 경우 함수는 False를 반환하고 오류 메시지가 트리거됩니다. 불법 문자는 일반적으로 다음을 포함합니다.
ASCII 제어 문자 (예 : 0x00 ~ 0x1f, 공백, 라인 브레이크, 탭 문자)
올바르게 탈출하지 않은 문자 (예 : & amp; )
XML 선언 또는 컨텐츠 인코딩은 실제 인코딩과 일치하지 않습니다.
NONTF-8 인코딩이지만 선언되지 않았습니다
이 문자는 XML 파서가 문자열 구조를 올바르게 이해할 수 없게 만들어 실패를 초래합니다.
정규 표현식을 통해 제어 문자를 제거 할 수 있습니다.
<?php
$xmlString = '여기에는 불법 문자가 포함되어 있습니다XML끈';
// 제어 문자 삭제,라인을 깨뜨리십시오(\n)、입력하다(\r)、탭 기호(\t)
$cleanXmlString = preg_replace('/[^\PC\s]/u', '', $xmlString);
$xml = simplexml_load_string($cleanXmlString);
if ($xml === false) {
echo "분석이 실패했습니다\n";
} else {
print_r($xml);
}
?>
XML 컨텐츠에 & , < , > 등과 같은 에스카로운 기호가있는 경우 먼저 탈출해야합니다.
<?php
$xmlString = '여기에는 에스코퍼가 포함되어 있습니다&상징XML끈';
$xmlString = str_replace('&', '&', $xmlString);
$xml = simplexml_load_string($xmlString);
if ($xml === false) {
echo "분석이 실패했습니다\n";
} else {
print_r($xml);
}
?>
참고 : 이미 합법적 인 XML 인 경우 교체하면 오류가 발생할 수 있으며 특정 상황에 대해 처리해야합니다.
simplexml_load_string은 기본적으로 UTF-8 인코딩 된 문자열을 처리합니다. XML이 또 다른 인코딩 (GBK, ISO-8859-1) 인 경우 먼저 인코딩을 변환해야합니다.
<?php
$xmlString = file_get_contents('http://gitbox.net/path/to/xmlfile.xml');
$xmlString = mb_convert_encoding($xmlString, 'UTF-8', 'GBK');
$xml = simplexml_load_string($xmlString);
if ($xml === false) {
echo "분석이 실패했습니다\n";
} else {
print_r($xml);
}
?>
더 나은 디버깅을 위해 내부 오류 캡처가 활성화 될 수 있습니다.
<?php
libxml_use_internal_errors(true);
$xmlString = '<invalid&xml>';
$xml = simplexml_load_string($xmlString);
if ($xml === false) {
foreach (libxml_get_errors() as $error) {
echo "실수:", $error->message;
}
libxml_clear_errors();
} else {
print_r($xml);
}
?>
다음은 불법 캐릭터 청소, 인코딩 보장 및 오류를 잡는 것을 보여주는 포괄적 인 예입니다.
<?php
libxml_use_internal_errors(true);
$xmlString = file_get_contents('http://gitbox.net/sample.xml');
// 불법 캐릭터를 정리하십시오(라인을 깨뜨리십시오、입력하다、탭 기호)
$xmlString = preg_replace('/[^\PC\s]/u', '', $xmlString);
// 코드를 변환하십시오 UTF-8(원래 인코딩이 GBK)
$xmlString = mb_convert_encoding($xmlString, 'UTF-8', 'GBK');
$xml = simplexml_load_string($xmlString);
if ($xml === false) {
echo "분석이 실패했습니다,실수信息如下:\n";
foreach (libxml_get_errors() as $error) {
echo trim($error->message), "\n";
}
libxml_clear_errors();
} else {
echo "성공적인 분석:\n";
print_r($xml);
}
?>
Simplexml_load_string 구문 분석이 실패하면 첫 번째 단계는 불법 제어 문자가 있는지 확인하고 적절하게 정리하는 것입니다.
XML 문자열의 특수 문자가 올바르게 탈출되었음을 확인하십시오.
XML 문자열이 UTF-8으로 인코딩되어 필요한 경우 변환해야합니다.
libxml_use_internal_errors (true)를 사용하여 자세한 오류 정보를 얻으려면 문제를 찾는 데 도움이됩니다.
이러한 기술을 습득하면 불법적 인 캐릭터로 인한 실패를 효과적으로 피할 수있어 XML 파싱을보다 안정적이고 신뢰할 수 있습니다.