거대한 XML 파일을 구문 분석하려고하는 PHP 스크립트가 있습니다. 이렇게하려면 XMLReader 라이브러리를 사용하고 있습니다. 구문 분석 중에 다음 인코딩 오류가 발생했습니다.XMLReader 인코딩 오류
입력이 올바르지 않습니다. 인코딩이 잘못되었습니다. 바이트 : 0xA0 0x32 0x36 0x30
나쁜 문자가있는 레코드를 건너 뛸 수 있는지 알고 싶습니다.
감사합니다.
거대한 XML 파일을 구문 분석하려고하는 PHP 스크립트가 있습니다. 이렇게하려면 XMLReader 라이브러리를 사용하고 있습니다. 구문 분석 중에 다음 인코딩 오류가 발생했습니다.XMLReader 인코딩 오류
입력이 올바르지 않습니다. 인코딩이 잘못되었습니다. 바이트 : 0xA0 0x32 0x36 0x30
나쁜 문자가있는 레코드를 건너 뛸 수 있는지 알고 싶습니다.
감사합니다.
먼저 XML 파일이 실제로 UTF-8로 인코딩되었는지 확인하십시오. 인코딩을 지정하지 않으면 두 번째 매개 변수로 XMLReader::open()
을 지정하십시오.
인코딩 오류가 UTF-8 문서의 실제 잘못된 바이트 시퀀스 때문일 경우 PHP> 5.2.0을 사용하는 경우 LIBXML_NOERROR
및/또는 (오류 수준에 따라) LIBXML_NOWARNING
을 비트 마스크로 전달할 수 있습니다. XMLReader::open()
의 세 번째 매개 변수로 :
$xml = new XMLReader();
$xml->open('myxml.xml', null, LIBXML_NOERROR | LIBXML_NOWARNING);
END_LINK하면 관심이 PHP>를 사용하는 경우 당신이 libXML
오류 처리를 조정할 수 5.1.0. 앞의 두 작업 차선책은 실제로는 오류 출력을 억제하면 오류의 경우에는 읽기 계속하거나 XMLReader
을 허용하는 경우
// enable user error handling
libxml_use_internal_errors(true);
/* ... do your XML processing ... */
$errors = libxml_get_errors();
foreach ($errors as $error) {
// handle errors here
}
libxml_clear_errors();
는 사실은 알지 못한다. 그러나 한번 시도해 볼 가치가 있습니다. 코멘트에 응답
:
libXML
는 XML_PARSE_RECOVER
(1)하지만 내선/libxml은 PHP의 상수로이 상수를 노출하지 않습니다 정의합니다. 아마도 정수 값 1
을 $options
매개 변수에 전달할 수 있습니다.
$xml = new XMLReader();
$xml->open('myxml.xml', null, LIBXML_NOERROR | LIBXML_NOWARNING | 1);
XML 파일이 매우 단순한 구조라면 잘못된 레코드를 없애거나 더 정확하게 수정하기 위해 "미리 필터링"할 수 있습니다.
레코드별로 레코드를 읽고 필터링 된 xml 파일을 작성한 다음 필터링 된 파일을 처리하십시오.
나는 XMLReader가 말하는 것을 들어봤을 것이다. 많은 인코딩은 ASCII의 상위 집합이므로, 예를 들어 UTF-8과 ISO-8859-1은 처음 128 개 코드 포인트에 대해 ASCII와 동일하다는 것을 기억하십시오. 파일이 실제로 ISO-8859-1로 인코딩되었지만 거의 모든 문자가 해당 문자 집합의 ASCII 절반보다 작습니다. 이 경우 오류는 XML, UTF-8에 대한 기본 인코딩을 사용하는 것이므로 오류가 발생합니다.
ISO-8859-1에서 바이트 시퀀스 0xA0 0x32 0x36 0x30
은 완전히 유효합니다. '2', '6', '0'이 뒤에 오는 비 분리 공백.
$xml = file_get_contents('myxml.xml'); $xml = preg_replace('/[\x0-\x1f\x7f-\x9f]/u', ' ', $xml); //parse $xml below
거대한 XML 파일을 문자열로 끌어 넣는 것은 성능에 대해 의식하고 있고 메모리가 얼마나 많은지 잘 알고있는 것은 아닙니다. 사용. –
내가 XML 파일을 처리하기 전에 libxml_use_internal_errors (TRUE) 함수를 호출하고 "LIBXML_NOERROR | LIBXML_NOWARNING"추가하려고의 XMLReader에 마스크 :: 오픈(). 이것은 매우 유용하지만 인코딩 오류가 발견되면 구문 분석이 여전히 중지됩니다. 오류가 발견 될 경우 libxml에게 구문 분석을 계속하도록 지시하는 방법이 있는지 알고 있습니까? –
코멘트에 대한 편집 된 답변. –
정수 값 1을 $ options 매개 변수에 전달하려고 시도했지만 동작이 변경되지 않았습니다.인코딩 오류가 발견되면 구문 분석이 중지됩니다. –