2009-03-05 34 views
2

私は、ベータWebサービスAPIを使用するAirアプリケーションを作成しています。時にはこのAPIが私に不正なXMLノードを返すことがあり、XMLオブジェクトを作成しようとすると、actionscriptはエラーを発生させます。不正な形式のXMLパーツを解析/無視する方法は?

私がやってきたのは、XMLが悪い場合は結果を捕まえて全体の応答を無視するだけですが、不正なノードを無視できます。例えば

<result> 
    <Song> 
    <location>http://www.anyurl.com/audio/loftparty092108_pt4.mp3</location> 
    <title>Phonte party @ The Loft, 9/21/08 (pt. 4)</title> 
    <artist>Statik, Jahsonic &amp; Stylus  <artist>Statik, Jahsonic &amp; Stylusre /> 
    </Song> 
</result> 

は、そのタグを参照してください?もし私がそのようなことができたら、私はソング全体をスキップして、次の曲を手に入れたいと思います。

これを達成する方法はありますか?

答えて

1
  1. ウェブサービスプロバイダにお問い合わせください。不正な形式のXMLについて教えてください。彼らはただそれを修正するかもしれない。
  2. 不正な形式のXMLが返されると、FlexのデフォルトのXMLデコーダが失われてスローされます。
  3. あなた自身のデコーダを処理してみてください。 HTTPServicexmlDecodeメンバーを参照してください。
+0

1.私はすでに行いました。私はちょうど私が彼らがそれを修正するときを知らないので、私のコードを迅速に修正したいと思った。 2.私はそれに気づいた。 :) 3.私はそれを調べますが、私はHTTPServiceを使用していません。自分でURLLoaderを実装しています。 – leolobato

+0

その場合、完全なイベントのカスタムハンドラが必要です。 – dirkgently

1

Beautiful SoupこれはPythonで書かれていますが、もちろん、ソースを掘り起こして、どのように実装したかを見ることができます。

1

エラーの種類が少ない場合は、エラーを取り除くためにXMLを前処理してから、パーサーに渡してください。これにより、問題が修正されたときに回避策を簡単に削除することができます。上記の場合、ファイルをテキストとしてロードし、重複タグを持つノードを探し、XMLテキストからノード全体を削除するだけです。

Webサービスプロバイダに通知して待ってください。不正な形式のXMLを返す場合は、すべてのパーサーがそれに気づき、すぐに解決するインセンティブが必要です。

1

いいえ、通常のXMLパーサーで不正な形式のXML文書の一部を無視することはできません。これは、Flexコンパイラに構文エラーを無視し、コーダが本当に意味するものを理解するようなものです。あなたは、奇形が何であるか、無視できるものを推測しようとする独自のパーサーを書く必要があります。

正直なところ、悪質なXMLを送信するWebサービス、ベータ版でさえ信頼できません。これは、プログラマティックなクラスを使用するのではなく、 "手作業で" XMLを構成していることを意味します。それを行う人は、他の多くのエラー、特に回帰をする可能性が高いです。あなたの時間は彼らに頼るにはあまりにも貴重です。

乾杯

+0

コードセマンティクスを推測するようにコンパイラに依頼することとまったく同じではありません。たとえば、構文解析ツリーから不正なノードを切り捨てて破棄するだけでは、そのブランチのデータを気にせず、より良いものが得られないことが分かっている場合は、完全に合理的です。実世界のプログラマは、常にデータソースを選択し、完全に仕様に準拠したデータを扱う贅沢さを常に持っているわけではありません。 (おそらく、あなたの上司がX社の仕事をする決断をしており、それについて何もできません。)あなたの仕事をするために仕事をしなければならないデータは、時には美しくありません。 –

関連する問題