1

HTTParty gemを使用して「&」記号を含むxmlファイルをダウンロードしようとしましたが、次のエラーが発生します。

"treeparser.rb:95:in `rescue in parse' <RuntimeError: Illegal character '&' 
 in raw string  "4860 BOOMM 10x20 MD&"> (MultiXml::ParseError)"

これが私のコードです:

class SAPOrders
  include HTTParty
  default_params :output => 'xml'
  format :xml
  base_uri '<webservice url>'
end

xml =  SAPOrders.get('/<nameOfFile.xml>').inspect

私は何が欠けていますか?

4

1 に答える 1

3

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&amp;'

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&amp;">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
于 2012-01-26T23:31:55.400 に答える