HTTPParty を使用していて、取得する前に着信 XML を解析しようとしている場合は、そのプロセスを get と parse に分割して、2 つの間にコードを配置できるようにする必要があります。
私はこれらの理由から OpenURI と Nokogiri を使用していますが、これら 2 つを使用するか、同等のものを使用するかに関係なく、XML を解析する前に前処理する機会があります。' &
' はそのままでは不正な文字です。エンコードするか、CDATA ブロックにする必要がありますが、残念ながらインターネットの世界では、不正な形式の XML フィードやファイルが多数存在します。
この作業で Nokogiri が気に入っている点は、少なくとも可能な限りチャグを続けていることです。ドキュメントが解析された後にエラーが発生したかどうかを調べることができます。また、パーサー設定の一部を微調整して、ドキュメントの動作を制御したり、不平を言ったりすることができます。
require 'nokogiri'
doc = Nokogiri::XML(<<EOT)
<a>
<b parm="4860 BOOMM 10x20 MD&">foobar</b>
</a>
EOT
puts doc.errors
puts doc.to_xml
どちらが出力されますか:
xmlParseEntityRef: no name
<?xml version="1.0"?>
<a>
<b parm="4860 BOOMM 10x20 MD">foobar</b>
</a>
Nokogiri は を削除しました&
が、それでも使用可能な出力を得ることができたことに注意してください。エラーが発生してオプションを使用して停止するか、続行するかを決定する必要がありますSTRICT
が、Nokogiri は必要に応じてどちらかを実行できます。
着信 XML をマッサージできます。
require 'nokogiri'
xml = <<EOT
<a>
<b parm="4860 BOOMM 10x20 MD&">foobar</b>
</a>
EOT
xml['MD&'] = 'MD&'
doc = Nokogiri::XML(xml) do |config|
config.strict
end
puts doc.errors
puts doc.to_xml
これで次のように出力されます:
<?xml version="1.0"?>
<a>
<b parm="4860 BOOMM 10x20 MD&">foobar</b>
</a>
これが完璧な答えではないことは承知していますが、多くの RSS/Atom および XML/HTML の解析を扱った経験から、時には汚いトリック バッグを開いて、洗練されたものではなく、機能するものを使用する必要があります。
HTTParty の涅槃へのもう 1 つの方法は、パーサーをサブクラス化することです。パーサーへの XML のそのフローに入り、そこでそれをマッサージできるはずです。ドキュメントから:
# Intercept the parsing for all formats
class SimpleParser < HTTParty::Parser
def parse
perform_parsing
end
end