2009-05-04 2 views
1

거대한 XML 파일을 구문 분석하려고하는 PHP 스크립트가 있습니다. 이렇게하려면 XMLReader 라이브러리를 사용하고 있습니다. 구문 분석 중에 다음 인코딩 오류가 발생했습니다.XMLReader 인코딩 오류

입력이 올바르지 않습니다. 인코딩이 잘못되었습니다. 바이트 : 0xA0 0x32 0x36 0x30

나쁜 문자가있는 레코드를 건너 뛸 수 있는지 알고 싶습니다.

감사합니다.

답변

8

먼저 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(); 

는 사실은 알지 못한다. 그러나 한번 시도해 볼 가치가 있습니다. 코멘트에 응답


:

libXMLXML_PARSE_RECOVER (1)하지만 내선/libxml은 PHP의 상수로이 상수를 노출하지 않습니다 정의합니다. 아마도 정수 값 1$options 매개 변수에 전달할 수 있습니다.

$xml = new XMLReader(); 
$xml->open('myxml.xml', null, LIBXML_NOERROR | LIBXML_NOWARNING | 1); 
+1

내가 XML 파일을 처리하기 전에 libxml_use_internal_errors (TRUE) 함수를 호출하고 "LIBXML_NOERROR | LIBXML_NOWARNING"추가하려고의 XMLReader에 마스크 :: 오픈(). 이것은 매우 유용하지만 인코딩 오류가 발견되면 구문 분석이 여전히 중지됩니다. 오류가 발견 될 경우 libxml에게 구문 분석을 계속하도록 지시하는 방법이 있는지 알고 있습니까? –

+0

코멘트에 대한 편집 된 답변. –

+0

정수 값 1을 $ options 매개 변수에 전달하려고 시도했지만 동작이 변경되지 않았습니다.인코딩 오류가 발견되면 구문 분석이 중지됩니다. –

0

XML 파일이 매우 단순한 구조라면 잘못된 레코드를 없애거나 더 정확하게 수정하기 위해 "미리 필터링"할 수 있습니다.

레코드별로 레코드를 읽고 필터링 된 xml 파일을 작성한 다음 필터링 된 파일을 처리하십시오.

2

나는 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'이 뒤에 오는 비 분리 공백.

0
 
$xml = file_get_contents('myxml.xml'); 
$xml = preg_replace('/[\x0-\x1f\x7f-\x9f]/u', ' ', $xml); 
//parse $xml below 

+0

거대한 XML 파일을 문자열로 끌어 넣는 것은 성능에 대해 의식하고 있고 메모리가 얼마나 많은지 잘 알고있는 것은 아닙니다. 사용. –