![](/img/trans.png)
[英]How do you make POST request with a XML data body using HTTParty on Rails
[英]How do you remove illegal characters from an xml file in HTTParty?
我试图使用HTTParty gem下载其中带有'&'符号的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
我想念什么?
如果您使用的是HTTPParty,并且它尝试解析传入的XML,然后才能使用它,那么您需要将该进程分为get和parse,以便将代码放在两者之间。
出于这些原因,我使用OpenURI和Nokogiri,但是无论您使用这两者还是它们的等效物,您都将有机会在解析XML之前对其进行预处理。 ' &
'裸露时是非法字符; 它应该被编码或放在CDATA块中,但是不幸的是,在互联网的狂野中,有许多格式不正确的XML提要和文件。
我喜欢Nokogiri来完成这项任务的事情是,它至少一直在努力挣扎。 您可以查看文档解析后是否有错误,还可以调整其某些解析器设置来控制文档的工作或抱怨:
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解析的经验,有时我们不得不打开脏tri的包装袋,然后选择一切可行的方法,而不是优雅的方法。
在HTTParty中实现必杀技的另一条路径是将解析器子类化 。 您应该能够进入XML解析器的流程,并在那里进行分析。 从文档:
# Intercept the parsing for all formats
class SimpleParser < HTTParty::Parser
def parse
perform_parsing
end
end
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.