如何从HTTParty中的xml文件中删除非法字符?

时间:2012-01-26 20:53:19

标签: ruby xml httparty

我试图下载一个包含'&'的xml文件使用HTTParty gem中的符号,我收到此错误:

"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

我错过了什么?

1 个答案:

答案 0 :(得分:3)

如果您正在使用HTTPParty并且它尝试解析传入的XML,然后您可以开始使用它,那么您需要将该进程拆分为get和parse,这样您就可以将代码放在两者之间

我出于这些原因使用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>

请注意,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中的必杀技的另一条路径是sub-class the parser。您应该能够将XML流转到解析器并在那里按摩它。来自文档:

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