2012-01-26 3 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를 그 이유만으로 사용하지만이 두 가지 또는 이와 동등한 것을 사용하더라도 구문 분석을하기 전에 XML을 사전 처리 할 수 ​​있습니다. '&'은 (는) 불법 문자입니다. 그것은 인코딩되거나 CDATA 블록에 있어야하지만, 불행히도 인터넷의 야생에서는 형식이 잘못된 XML 피드와 파일이 많이 있습니다.

나는이 일을 위해 노코 기리 (Nokogiri)에 대해 좋아하는 것은 그것이 적어도 가능한 한 칙칙폭폭 새기다. 당신은 문서를 구문 분석 후 오류를 가지고 있는지 볼 수, 당신은 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

우수 답변! –

관련 문제