4

私は、複数のサイトから XML をスクレイピングし、希望する方法でデータを処理することを目的とした小さなアプリケーションを作成しています。私は以前にそのようなアプリケーションを作成しましたが、異なる言語で、Haskell の練習用にこれを書いています。

とにかく、ポイントに。Web で何百万もの XML パーサーを調べた結果、HXT を使用することにしました。ページhttp://www.haskell.org/haskellwiki/HXT/Conversion_of_Haskell_data_from/to_XMLに従って、 XML ファイルを読み取り、それを定義した Haskell データ型に入れているように見えるものに到達しました。これを実現するために、XmlPickler のインスタンスを使用してファイルからデータを読み取ります。このエラーを除いて、うまくいくものにたどり着きました:

fatal error: document unpickling failed
xpCheckEmptyAttributes: unprocessed XML attribute(s) detected

すべての属性を処理していないことは承知しています。すべての属性が必要なわけではありません。これらを無視する方法はありますか?すべての属性を処理し、それらを新しいデータ型に入れ、そこから属性を抽出して、実際に必要なデータを取得できると思います。私はこの小さなハックを避けたいので、ここに来て The Proper Way™ を求めています。

仕事に間違ったツールを使用していませんか? サードパーティのデータを unpickle することは安全ではありませんか (Python の場合のように)?

解決策を Web で調べましたが、Text.XML.HXT.Arrow.XmlState.SystemConfigこの動作を無効にするために必要なものがないようです。

4

2 に答える 2

5

私は先日、この正確な問題に遭遇し、次の結論に達しました。

仕事に間違ったツールを使用していますか?

はい。HXTのピクルス機能は、データのシリアル化と逆シリアル化を簡単に行えるように設計されていますが、柔軟性はあまりありません。リンク先のページから:

これらは、理想的には同じピッカーによって生成された、マシンで生成されたXMLを読み取ることを目的としています。

はどうかと言うと:

サードパーティのデータの選択を解除することは安全ではありませんか(Pythonの場合のように)?

いいえ、HXTではありません。Pythonでのピクルスは、任意のコンテンツでeval()を呼び出すことと(大まかに)同等であるため、安全ではありません。HXTは単なるXMLパーサーであり、任意のコードが実行されることはありません。

個人的には、HXTのピッカーに自分のやりたいことをやらせようとするのではなく、xmlパッケージ(Text.XML.Light)を使用して手動でXMLを処理するようになりました。それほど簡潔ではありませんが、気にしないデータを無視することができます。矢印が好きなら、おそらくHXTの非ピクルス部分も同様に使用できます(私はまだそれらの周りに頭を包んでいます;))。

于 2012-08-23T08:20:13.897 に答える