2012-01-26 11 views
1

私はHTTParty宝石を使用して、その中に「&」のシンボルを持っているxmlファイルをダウンロードしようとしていたと私はこのエラーを取得しています:HTTPartyのxmlファイルから不正な文字を削除するにはどうすればよいですか?

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

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

何午前:ここ

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

は私のコードです私は行方不明?

答えて

3

HTTPPartyを使用していて、手に入る前に入力XMLを解析しようとしている場合は、そのプロセスをgetと解析に分割する必要があります。二。

これらの理由からOpenURIとNokogiriを使用していますが、これらの2つを使用するか、それと同等のものを使用する場合でも、解析前にXMLを前処理する機会があります。 '&'は裸のときは不正な文字です。それはコード化されているかCDATAブロックであるべきですが、残念なことにインターネットの野生では、不正な形式のXMLフィードやファイルがたくさんあります。

この仕事のためにノコギリが好きなのは、少なくともできるだけ頑張っているということです。あなたは、文書が解析された後にエラーがあったかどうかを確認するために見ることができ、あなたはtweak some of its parser settingsはそれが何をするかを制御または文句を言うことができますについて:

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> 

お知らせその鋸山&を取り除いたが、私はまだ使用可能な出力を得ることができた。エラーを表示し、STRICTオプションを使用して停止するか続行するかを決定する必要がありますが、必要に応じてNokogiriがどちらかを実行できます。/

<?xml version="1.0"?> 
<a> 
    <b parm="4860 BOOMM 10x20 MD&amp;">foobar</b> 
</a> 

私は、これは完璧な答えではないですけど、私の経験からRSSの多くを扱う:今出力

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をマッサージすることができますAtomやXML/HTML解析では、時にはダーティ・トリック・バッグを開いて、エレガントなものではなく、どんなものでも動作させる必要があります。

HTTPartyのニルバナへの別のパスは、sub-class the parserです。 XMLの流れをパーサに取り込んでそこにマッサージすることができるはずです。ドキュメントから:

# Intercept the parsing for all formats 
class SimpleParser < HTTParty::Parser 
    def parse 
    perform_parsing 
    end 
end 
+0

優秀な回答! –

関連する問題