1

私は、トラフィックシミュレーションソフトウェアによって生成されたいくつかのxmlファイルからデータを抽出するための一連のツールをPythonで作成しています。結果のファイルは非常に大きくなる可能性があるため、xml.parsers.expatを使用してそれらを解析します。

問題は、Windows XPマシンでスクリプトを実行すると完全に機能しますが、自宅のUbuntu 10.10では、まったく同じファイルで次のエラーが発生することです。
ExpatError: not well-formed (invalid token): line 1, column 0

ファイルは元々utf-8でエンコードされており、タグで宣言されたエンコードはASCIIであったため、成功せずにutf-8(またはUTF8またはutf8)に変更してみてください。BOMがなかったので、私はそれを書き込もうとしましたが、それでも成功しませんでした。また、Windowsの改行(CR / LF)をUnixの改行(CR)に置き換えようとしましたが、成功しませんでした。

また、動作中のpythonのバージョンは2.7.1で、Ubuntuボックスでは2.6.6ですが、私の問題が関連しているとは思わないでください。数週間前に、作業用コンピューターのPythonを2.6から2.7に問題なくアップグレードしました。

私はここでは専門家ではないので、アイデアが不足しています、何かヒントはありますか?

編集:さらに調査したところ(今は頭痛がして、Unicode関連の問題は嫌いです)、システム環境変数LANG、LC_ALL、およびLANGUAGEを(私の場合は)「fr_FR.utf-8」に適切に設定することで問題が解決したようです。 。なぜ最初はそうでなかったのか、なぜ今はうまくいくのかわかりません...

手に感謝します!

4

2 に答える 2

3

ドキュメントからの抜粋:

xml.parsers.expat.XML_ERROR_INVALID_TOKEN
入力バイトを文字に適切に割り当てることができなかった場合に発生します。たとえば、UTF-8入力ストリームのNULバイト(値0)。

ExpatError.lineno
エラーが検出された行番号。最初の行には1の番号が付けられています。

ExpatError.offset
エラーが発生した行への文字オフセット。最初の列には0の番号が付けられています。

上記は、ファイルの最初のバイトに問題があることを示している傾向があります。

Windowsで動作した元のファイルから始めます。質問を編集して、これを行った結果を表示します。

python -c "print repr(open('win_ok_file.xml', 'rb').read(200))"

これにより、ファイルの最初の200バイトに何が含まれているかが明確に示されます。

また、チェックしたコードの縮小版がWindowsで機能して初期エラーを回避できることを示してください。ただし、Linuxでは問題が再現されます。

いくつかの主張、それらが価値があるもののために:

  • 「ファイルは元々utf-8でエンコードされており、タグで宣言されたエンコードはasciiでした」... XML宣言のエンコードが「ascii」であるが、ファイルに非ASCII文字が含まれている場合、準拠するパーサーは例外。何を報告してもよろしいですか?

  • XMLドキュメントのデフォルトのエンコーディングはUTF-8です。つまり、XML宣言でエンコーディングが言及されていない場合、またはXML宣言がまったくない場合、パーサーはUTF-8を使用してデコードする必要があります。

  • UTF-8 BOMを最初に配置すると、支援よりも妨げになる可能性が高くなります。

  • XML標準では、パーサーがCRXMLドキュメント内の有効なバイトとして受け入れ、すぐに存在しないふりをする必要があります(おそらく、を含む要素内を除く xmlns:space="preserve")。に変更 CR LFするLFのは良い考えではありません。

そして、いくつかの質問:「かなり大きな」ファイルのバイト数は?iterparse()fromxml.etree.cElementTreeまたはの使用を検討しましたかlxml

于 2011-02-22T19:12:09.387 に答える
3

私は同じ問題を抱えていました、そして、このようにファイルを直接解析しようとする代わりに:

document = xmltodict.parse("myfile.xml") # Parse the read document string

以前は次のようにオブジェクトを介してxmlドキュメントを開くことにより、間接的に解析しました。

document_file = open("myfile.xml", "r") # Open a file in read-only mode
original_doc = document_file.read() # read the file object
document = xmltodict.parse(original_doc) # Parse the read document string

そしてそれはうまくいった。

于 2014-04-04T13:07:24.053 に答える