巨大なXMLファイルを解析しようとしているPHPスクリプトがあります。これを行うために私はXMLReaderライブラリを使用しています。解析中に、このエンコードエラーが発生しました:XMLReaderエンコーディングエラー
入力が適切ではありません。エンコードが必要です。バイト数:0xA0 0x32 0x36 0x30
悪い文字のレコードをスキップする方法であるかどうかを知りたいと思います。
ありがとうございます!
巨大なXMLファイルを解析しようとしているPHPスクリプトがあります。これを行うために私はXMLReaderライブラリを使用しています。解析中に、このエンコードエラーが発生しました:XMLReaderエンコーディングエラー
入力が適切ではありません。エンコードが必要です。バイト数:0xA0 0x32 0x36 0x30
悪い文字のレコードをスキップする方法であるかどうかを知りたいと思います。
ありがとうございます!
まず、XMLファイルが実際にUTF-8でエンコードされていることを確認してください。 2番目のパラメータとして符号化を指定しない場合は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);
your're>はPHPを使用している場合は、libXML
エラー処理を微調整することができます5.1.0。前の2回避策は、実際に彼らが唯一のエラー出力を抑制した場合にエラーが発生した場合には読み続けたりする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();
は、私が実際に知りません。しかし、それは試してみる価値がある。
コメントへの応答:
XML_PARSE_RECOVER
libXML
(1)を定義するが、EXT /のlibxmlはPHP定数としてこの定数を公開しません。おそらく整数値1
を$options
パラメータに渡すことは可能です。あなたのXMLファイルは、本当にシンプルな構造を持っている場合
$xml = new XMLReader();
$xml->open('myxml.xml', null, LIBXML_NOERROR | LIBXML_NOWARNING | 1);
、あなたは「プレフィルター」それは、RID(またはより良い、正しい)間違ったレコードを取得することがあります。
レコードでレコードを読み取り、フィルタ処理された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(真)関数を呼び出すと、 "LIBXML_NOERROR | LIBXML_NOWARNING" を追加しようとしたのXMLReaderにマスク::オープンを()。これは非常に便利ですが、エンコーディングエラーが見つかった場合でも解析は停止しています。エラーが見つかった場合、libxmlに解析を続行するように指示する方法があるかどうかを知っていますか? –
コメントに関する編集回答。 –
整数値1を$ optionsパラメータに渡そうとしましたが、動作は変更されません。エンコーディングエラーが検出されると、解析は停止されます。 –