2010-07-01 3 views
0

J'ai essayé d'ouvrir le fichier xml en utilisant les deux façons, mais seulement la dernière partie a fonctionné lorsque j'ai essayé d'utiliser xpath.différence entre Nokogiri :: XML (File.open()) et Nokogiri.parse (open())

par exemple, doc = comme dans le titre;

doc.xpath('//feed/xyz'), worked only when I open the file using parse method. 

Une chose que je remarquai était l'objet lors de l'ouverture en utilisant XML :: :: est Nokogiri XML :: Document, alors que celui-ci était un Nokogiri :: HTML :: document

Tous les commentaires?

Répondre

1

Nokogiri.parse analyse les documents HTML, tandis que Nokogiri::XML attend un document XML valide. il semble que lorsque l'analyse XML échoue, l'erreur n'est pas levée, un document XML vide est généré. essayez puts doc.to_s, vous verrez probablement "<?xml version=\"1.0\"?>\n"

+0

oui! c'est vrai! Je me demandais juste pourquoi, car je ne vois aucune erreur en tant que telle dans le document XML. Ouvre bien dans un navigateur. – vkris

+0

Selon le code source, ceci n'est pas correct. 'Nokogiri.parse' tente de déterminer si un document est HTML en recherchant une chaîne lisible ou une correspondance'/^ \ s * <[^Hh>] * html/i' au début de la chaîne, et si ces tests échouent, il la traite en tant que document XML. Votre meilleur pari est de forcer l'analyse en utilisant 'Nokogiri :: XML()' pour les documents XML ou 'Nokogiri :: HTML()' pour le HTML. Dans les deux cas, Xpath et CSS fonctionneront toujours. Vérifiez le tableau 'errors' du document retourné pour les erreurs d'analyse ou votre modèle xpath si le modèle ne fonctionne pas. –

+0

tin man, vous êtes rigt, ma partie à propos de cette parse analyse HTML était faux, ce qui est évident même après avoir lu la documentation – mykhal

3

Nokogiri utilise un test simple pour déterminer si un document est HTML ou XML lorsque vous appelez la méthode générique Nokogiri.parse. Je l'ai vu return the wrong results, et la meilleure solution est de donner un peu plus d'aide à Nokogiri. Au lieu d'utiliser parse, utilisez Nokogiri::XML('some xml string') ou Nokogiri::HTML('some html string') et il fera toujours la bonne chose. Voir Parsing an HTML/XML Document.

XML, par définition, devrait valider. Nokogiri est utile et essayera d'analyser XML incorrect (sinon il ne pourrait pas analyser HTML), mais quand il rencontre un mauvais XML, il signalera le problème en utilisant le tableau errors comme un wrapper. Si vous connaissez une source pour votre document est fiable alors vous pouvez passer la vérification mais c'est si facile que vous pourriez aussi bien faire quelque chose comme doc.errors.any? et réagir si c'est vrai.

Vous ne dites pas quel type de XML vous essayez d'analyser, mais il y a le XML et puis il y a le XML wanna-be. Votre Xpath suggère que vous essayez d'analyser un flux. J'ai rencontré tellement de mauvais flux XML que je ne suis pas surpris que vous ayez rencontré des erreurs. Nokogiri essaie de comprendre les conditions du monde réel, mais parfois cela ne suffit pas et vous devez dire à Nokogiri d'être plus indulgent lors de l'analyse syntaxique. Voir le options for Nokogiri::XML pour obtenir les drapeaux.

Vous dites également dans votre commentaire à la réponse sélectionnée, que le document s'ouvre bien dans le navigateur. Un navigateur n'est pas une bonne mesure pour savoir si le document est valide, parce que les navigateurs ne font pas de validation, et, au lieu de faire tout ce qu'ils peuvent présenter quelque chose lisible, même si ce n'est pas réellement correct. Un parseur, comme Nokogiri, doit être beaucoup plus rigide lors de l'analyse car il n'y a pas de cerveau humain interprétant les résultats. Le code qui extrait des données de XML n'est pas aussi indulgent à propos des erreurs, il ne devrait pas l'être.

Questions connexes