Question

J'essayais de télécharger un fichier XML qui contient des «symboles en utilisant le joyau httparty et j'obtiens cette erreur:

"treeparser.rb:95:in `rescue in parse' <RuntimeError: Illegal character '&' 
 in raw string  "4860 BOOMM 10x20 MD&"> (MultiXml::ParseError)"

Voici mon code:

class SAPOrders
  include HTTParty
  default_params :output => 'xml'
  format :xml
  base_uri '<webservice url>'
end

xml =  SAPOrders.get('/<nameOfFile.xml>').inspect

Qu'est-ce que je rate?

Était-ce utile?

La solution

Si vous utilisez HTTPPARTY et qu'il essaie d'analyser le XML entrant avant de pouvoir mettre la main dessus, vous devrez alors diviser ce processus en GET et l'analyse, afin que vous puissiez mettre du code entre les deux.

J'utilise OpenUri et Nokogiri pour ces raisons, mais que vous utilisiez ces deux, ou leurs équivalents, vous aurez la possibilité de prétraiter le XML avant de l'analyser. '&«est un caractère illégal à nu; Il doit être codé ou dans un bloc CDATA, mais malheureusement dans la nature sauvage d'Internet, il y a beaucoup de flux et de fichiers malformés.

Ce que j'aime chez Nokiogiri pour cette tâche, c'est qu'elle continue de se diriger, du moins autant que possible. Vous pouvez chercher à voir si vous avez eu des erreurs après l'analyse du document, et vous pouvez Ajuster certains de ses paramètres d'analyse Pour contrôler ce qu'il fera ou se plaindra:

require 'nokogiri'

doc = Nokogiri::XML(<<EOT)
<a>
  <b parm="4860 BOOMM 10x20 MD&">foobar</b>
</a>
EOT

puts doc.errors
puts doc.to_xml

Qui sortira:

xmlParseEntityRef: no name
<?xml version="1.0"?>
<a>
  <b parm="4860 BOOMM 10x20 MD">foobar</b>
</a>

Notez que Nokogiri a dépouillé le & Mais j'ai toujours pu obtenir une sortie utilisable. Vous devez décider si vous voulez une erreur et vous arrêter en utilisant le STRICT L'option, ou pour continuer, mais Nokogiri peut le faire, selon vos besoins.

Vous pouvez masser le XML entrant:

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

Qui sort maintenant:

<?xml version="1.0"?>
<a>
  <b parm="4860 BOOMM 10x20 MD&amp;">foobar</b>
</a>

Je sais que ce n'est pas une réponse parfaite, mais d'après mon expérience, traitant de nombreux rss / atomes et analyses XML / HTML, nous devons parfois ouvrir le sac sale et aller avec tout ce qui fonctionne au lieu de ce qui était élégant.

Un autre chemin vers Nirvana à Httparty serait de sous-classe l'analyseur. Vous devriez être en mesure de pénétrer dans ce flux du XML vers l'analyseur et de le masser là-bas. Des documents:

# Intercept the parsing for all formats
class SimpleParser < HTTParty::Parser
  def parse
    perform_parsing
  end
end
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top