XML_PARSE_INTO_STRUCT () 는 국외 XML 구문 분석 라이브러리를 기반으로 한 함수이며 프로토 타입은 다음과 같습니다.
int xml_parse_into_struct ( resource $parser , string $data , array &$values [, array &$index ] )
$ parser : XML_PARSER_CREATE () 에 의해 생성 된 파서.
$ 데이터 : XML 문자열이 구문 분석됩니다.
$ 값 : 순서대로 배열 된 XML 데이터 구조의 배열.
$ index : 옵션, 레이블 이름과 해당 색인을 기록하는 데 사용됩니다.
함수는 1을 반환하여 구문 분석이 성공했음을 나타내고, 함수는 0을 반환하여 고장을 나타냅니다.
XML은 매우 엄격한 서식 요구 사항을 가진 마크 업 언어이며 일반적인 오류는 다음과 같습니다.
unded되지 않은 태그
속성은 인용되지 않습니다
불법 캐릭터 (예 : 제어 문자)
태그 중첩 오류
샘플 코드 :
$data = '<root><item>Test</root>'; // 없어진 </item> 상표
$parser = xml_parser_create();
if (!xml_parse_into_struct($parser, $data, $values)) {
echo "XML Error: " . xml_error_string(xml_get_error_code($parser));
}
xml_parser_free($parser);
산출:
XML Error: mismatched tag
XML 선언의 인코딩 (예 : <? xml version = "1.0"encoding = "utf-8"?> )은 실제 컨텐츠 인코딩과 일치하지 않으므로 구문 분석이 실패합니다.
예를 들어, 파일은 UTF-8으로 선언되지만 콘텐츠는 실제로 GBK 인코딩되어 불법 문자 오류가 발생합니다.
해결책 :
파일 인코딩 및 XML 선언이 일관되어 있는지 확인하십시오.
mb_convert_encoding ()을 사용하여 UTF-8로 변환하십시오.
$data = mb_convert_encoding($data, 'UTF-8', 'GBK');
< , > , & , " 및 'XML의' 는 탈출 해야하는 특수 문자입니다.
< → & & lt;
> → & gt;
& → & amp;
예를 들어:
$data = '<note>Tom & Jerry</note>'; // 실수:탈출되지 않았습니다 &
다음으로 변경해야합니다.
$data = '<note>Tom & Jerry</note>';
레이블 이름은 숫자 나 특수 문자로 시작할 수 없으며 공백을 포함 할 수 없습니다. 예를 들어:
<123tag>value</123tag> <!-- 불법적인 -->
<tag name="a b">value</tag> <!-- 속성 값의 공간은 인용되지 않습니다 -->
이 두 기능은 문제를 신속하게 찾는 데 도움이 될 수 있습니다.
if (!xml_parse_into_struct($parser, $data, $values)) {
echo "Error: " . xml_error_string(xml_get_error_code($parser)) .
" at line " . xml_get_current_line_number($parser);
}
문제 해결 과정에서 XML을 https://gitbox.net/tools/xml-validator/ 와 같은 온라인 확인 도구에 붙여 넣어 구문 오류를 빠르게 발견 할 수 있습니다.
XML이 원격 인터페이스 또는 외부 파일에서 발생하는 경우, 구문 분석하기 전에 다음을 청소하고 기록하는 것이 좋습니다.
file_put_contents('/tmp/raw_xml.log', $data);
또한 다음 청소 기능을 사용하는 것이 좋습니다.
function clean_xml($data) {
$data = trim($data);
// 제거하다 BOM
$data = preg_replace('/^\xEF\xBB\xBF/', '', $data);
// 보이지 않는 문자 삭제
return preg_replace('/[^\x09\x0A\x0D\x20-\x7F\xA0-\xFF]/', '', $data);
}
xml_parse_into_struct () 는 dom을 사용하지 않지만 xml을 읽기 전에 libxml_use_internal_errors ()를 사용하여 전체 디버깅에 도움이됩니다.
libxml_use_internal_errors(true);
명확한 구조와 양호한 형식의 XML의 경우 SimpleXML이 더 권장됩니다.
$xml = simplexml_load_string($data);
보다 친숙한 객체 인터페이스와 높은 결함 공차를 제공합니다.