如果您使用的是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中涅ana的另一条路径是sub-class the parser。您应该能够将该XML流转入解析器并在该处进行处理。从文档:
# Intercept the parsing for all formats
class SimpleParser < HTTParty::Parser
def parse
perform_parsing
end
end
优秀的答案! –