PHP에서 XML 데이터를 처리 할 때 XML_PARSE ()는 XML 데이터를 구조화 된 정보로 구문 분석하는 데 도움이되는 일반적인 기능입니다. 그러나 불규칙하고 부정확 한 형식이거나 깔끔한 XML 데이터에 직면하면이 기능은 오류를 쉽게 던질 수있어 전체 프로그램이 중단되거나 출력 예외가 발생할 수 있습니다.
그렇다면 XML_PARSE ()를 사용할 때, 특히 불규칙한 XML을 발견 할 때 구문 분석 오류를 어떻게 피할 수 있습니까? 다음은 실용적인 팁과 코드 예제입니다.
XML_PARSE ()를 사용하기 전에 프로그램이 조용히 실패하지 않고 구문 분석이 실패 할 때 특정 오류 정보가 캡처되도록 항상 오류 감지를 활성화하는 것이 좋습니다.
$xml = '<root><item>데이터1<item><item>데이터2</item></root>'; // 불규칙한XML
$parser = xml_parser_create();
xml_set_error_code($parser, XML_ERROR_NONE);
if (!xml_parse($parser, $xml, true)) {
$errorCode = xml_get_error_code($parser);
$errorMsg = xml_error_string($errorCode);
$line = xml_get_current_line_number($parser);
$column = xml_get_current_column_number($parser);
echo "구문 분석 오류:$errorMsg 에서 $line 좋아요,1. $column 목록\n";
}
xml_parser_free($parser);
불규칙한 XML을보다 안전하게 구문 분석하기 위해 LIBXML 의 결함 방해 모드를 사용하여 데이터를 전제 한 다음 XML_PARSE () 또는 SIMPLEXML_LOAD_STRING () 과 같은 함수로 처리하여 처리 할 수 있습니다.
libxml_use_internal_errors(true);
$xml = '<root><item>데이터1<item><item>데이터2</item></root>';
$dom = new DOMDocument();
$dom->loadXML($xml, LIBXML_NOERROR | LIBXML_NOWARNING | LIBXML_NONET | LIBXML_COMPACT | LIBXML_NOCDATA);
if (!$dom) {
foreach (libxml_get_errors() as $error) {
echo "LibXML 실수:{$error->message}\n";
}
libxml_clear_errors();
} else {
echo "XML 성공적으로로드,계속 구문 분석 할 수 있습니다。\n";
}
때로는 데이터 소스가 외부 API를 반환하는 XML (예 : http://api.m66.net/data.xml )과 같은 데이터 소스가 불안정합니다. 이 경우 먼저 정규 또는 수동 방법을 사용하여 구부리지 않은 태그 또는 불법 문자와 같은 일반적인 문제를 해결할 수 있습니다.
$xml = file_get_contents('http://api.m66.net/data.xml');
// 간단한 수정:미 세게 태그를 교체하십시오
$xml = preg_replace('/<item>([^<]*)<item>/', '<item>$1</item><item>', $xml);
// 然后再进좋아요解析
$parser = xml_parser_create();
if (!xml_parse($parser, $xml, true)) {
echo "여전히 존재합니다 XML 실수,그것을 다루는 다른 방법을 시도하십시오。\n";
}
xml_parser_free($parser);
?? 참고 :이 방법은 형식에 특정 기대치가있는 시나리오에 적합하며 복잡한 구조 XML에 정기적 인 하드 수정을 사용하는 것이 좋습니다.
때로는 도구를 변경하는 것이 더 안정적입니다. 예를 들어, SimpleXML 은 더 강력한 결함 허용 오류와 유지 관리가 더 쉽습니다.
$xml = file_get_contents('http://api.m66.net/data.xml');
libxml_use_internal_errors(true);
$simpleXml = simplexml_load_string($xml);
if ($simpleXml === false) {
echo "SimpleXML 분석이 실패했습니다,실수如下:\n";
foreach (libxml_get_errors() as $error) {
echo $error->message;
}
} else {
echo "SimpleXML 성공적인 분석!\n";
}
xml_parse ()를 사용할 때 불규칙한 XML에 직면하는 모범 사례 :
오류보고를 활성화하여 찾기 문제를 촉진합니다.
전처리로 libxml 결함 내성 구문 분석을 사용하십시오.
필요한 경우 XML을 수정하기 위해 정기 또는 domDocument를 사용하십시오.
데이터 형식을 통제 할 수없는 경우 SimpleXML 과 같은 더 나은 결함 공차 파서를 사용하십시오.
XML 형식이 합리적이고 XML_PARSE ()를 사용하여 코드를 개선 할 수 있으며 형식 문제로 인해 전체 서비스가 느슨해지지 않아도됩니다.
이 팁이 모든 종류의 "까다로운"XML 데이터를 처리하는 데 도움이되기를 바랍니다. 특정 구문 분석 오류가 발생하면 XML 컨텐츠를 게시 할 수 있으며 귀하를 위해 분석 할 수도 있습니다 ~