Comment supprimer les caractères illégaux d'un fichier XML dans Httparty?
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?
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&'
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&">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