3

Firefox で開くと、約 23 から 30 MB の XML ドキュメントを生成しようとしています。

XML Parsing Error: not well-formed
Location: file:///Users/User/Downloads/export(2).xml
Line Number 137725, Column 1343:

その後、ドキュメントを検証しようとするとXML Nanny、次のエラーが表示されます。

Invalid Character (Unicode: 0xB)

数 (13) 行: 137725、137738、137751、137764、137777、137790、137803、137816、146834、189949、193444、193457、193470

以下を含むいくつかの「解決策」を試しました。

  1. 正規表現:

    preg_replace(
      '/[^\x9\xA\xD\x20-\x{D7FF}\x{E000}-\x{FFFD}\x{10000}-\x{10FFFF}]+/'
      , ' ', $data->Description);
    

    ここでの問題は、Apache で mod セキュリティが有効になっているために内部サーバー エラーが発生するため、これが有効な RegEx であるかどうか確信が持てないことです。

  2. ファイルをBOM付きのUTF-8で保存しようとしましたが、それは必死でした

  3. 「UTF-8 // IGNORE」でiconvを使用しようとしましたが、これは役に立ちませんでした

  4. 文字ごとの置換を使用しようとしましたが、23万行あるため、これは私のファイルではうまく機能しませんでした..その問題がある特定のタグを置き換えても、phpでmax_execution_timeディレクティブをトリガーし、私のスクリプトは殺されました。

今のところ私の解決策は、この無効な文字のデータベース レコードを手動で消去することですが、これは私の問題に対する適切かつ正しい解決策です。将来的には、このスクリプトを使用してこのエクスポートを自動化し、手動編集はオプションまたはスピーチの対象ではないからです。

4

2 に答える 2

2

まず、XML Nanny から提供された情報に固執します。

Invalid Character (Unicode: 0xB) (several lines)

0xB は制御文字範囲の文字ですが、XML ドキュメントでは非常に限られた制御文字しか使用できません。それらを数値エンティティに置き換えて、もう一度やり直すことをお勧めします。

$xml = strtr($xml, array("\x0B" => ""));

Firefox はそれらを受け入れるかもしれません。

于 2012-04-10T20:22:05.287 に答える
1

私はいつかそのような同様の問題に直面しました。私が行ったのは、base64encodeを使用してデータを暗号化してから、XMLで送信し、受信した後、デコードしました。これがあなたのために働くかどうか教えてください。または、私があなたの質問を明確に理解していなかった場合はどうなりますか?

于 2012-04-11T08:48:49.007 に答える