PHP에서 XML 데이터를 처리 할 때 XML 문자열을 XML_PARSE 기능을 사용하여 구문 분석 할 수 있습니다. 그러나 XML 파일은 종종 구분되지 않은 태그 또는 문자 인코딩 오류와 같은 포맷 문제가 있으므로 구문 분석 장애로 이어질 수 있습니다. 이러한 오류를 우아하게 잡고 처리하기 위해 XML_PARSE , XML_GET_ERROR_CODE , XML_ERROR_STRING 및 XML_GET_CURRENT_LINE_NUMBER 와 같은 함수를 사용할 수 있습니다.
이러한 기능을 사용하여 XML 구문 분석 오류를 감지하고보고하는 방법에 대한 완전한 예를 살펴 보겠습니다.
<?php
// 오류를 시뮬레이션하십시오 XML 끈(닫힌 태그 누락)
$xmlData = <<<XML
<note>
<to>사용자</to>
<from>관리자</from>
<heading>상기시키다</heading>
<body>이것은 테스트 메시지입니다
</note>
XML;
// 만들다 XML 파서
$parser = xml_parser_create();
// 设置파서选项
xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0); // 레이블 케이스를 유지하십시오
xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 1); // 공백 문자를 무시하십시오
// 구문 분석하십시오 XML 데이터
if (!xml_parse($parser, $xmlData, true)) {
$errorCode = xml_get_error_code($parser);
$errorMessage = xml_error_string($errorCode);
$lineNumber = xml_get_current_line_number($parser);
echo "? 분석 XML 오류가 발생했습니다:\n";
echo "오류 메시지:$errorMessage\n";
echo "오류 코드:$errorCode\n";
echo "오류 행 카운트:$lineNumber\n";
// 오류 로깅,或者引导사용자查看帮助页面
// 예:로그 오류 로그 파일에 오류가 발생합니다
error_log("XML 분석错误:$errorMessage 에서 $lineNumber 좋아요", 3, "/var/log/xml_errors.log");
// 또는 도움말 링크를 표시합니다
echo "도움말 문서를 참조하십시오:https://m66.net/xml/help\n";
} else {
echo "? XML 분석成功!\n";
}
// 释放파서资源
xml_parser_free($parser);
?>
xml_parser_create ()
나중에 XML 문자열을 구문 분석하는 데 사용되는 XML 파서 리소스를 만듭니다.
xml_parse ()
제공된 XML 문자열을 구문 분석합니다. 구문 분석이 실패하면 거짓이 반환됩니다.
xml_get_error_code () / xml_error_string ()
오류 코드를 가져 와서 읽을 수있는 오류 정보로 변환하십시오.
xml_get_current_line_number ()
오류가 발생하면 라인 번호를 얻으십시오. 이는 문제의 빠른 위치를 용이하게합니다.
XML_PARSER_FREE ()
메모리 누출을 피하기 위해 구문 분석 후 릴리스 리소스가 완료됩니다.
이 방법은 다음 시나리오에 매우 적합합니다.
사용자가 XML 파일을 업로드 할 때 확인 형식;
타사 인터페이스가 XML 데이터를 반환 할 때 고장 내성 처리;
자동화 된 데이터 가져 오기 시스템에서 로직 사전 점검;
온라인 편집기에서 XML 형식의 즉시 확인.
DOM 또는 SimpleXML을 사용하여 LIBXML 확장을 사용하면보다 고급 XML 작동 방법을 제공하지만 대규모 데이터 스트림을 처리 할 때 XML_PARSE 와 같은 기본 원래 파서가 더 효율적입니다.
외부 XML 데이터를 직접 신뢰하지 마십시오. 형식 오류 외에도 악성 엔티티 (XXE 공격)에 주입 될 수도 있습니다. 엔티티 구문 분석 기능을 끄는 것을 잊지 마십시오.