2012-01-26 144 views
1

我试图下载使用HTTParty创业板中有“&”符号的XML文件,我收到此错误:如何从HTTParty中的xml文件中删除非法字符?

"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 

什么时我错过了?

回答

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中涅ana的另一条路径是sub-class the parser。您应该能够将该XML流转入解析器并在该处进行处理。从文档:

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

优秀的答案! –