繁体   English   中英

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

[英]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&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解析的经验,有时我们不得不打开脏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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM