我试图下载一个包含'&'的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
我错过了什么?
答案 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&'
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中的必杀技的另一条路径是sub-class the parser。您应该能够将XML流转到解析器并在那里按摩它。来自文档:
# Intercept the parsing for all formats
class SimpleParser < HTTParty::Parser
def parse
perform_parsing
end
end