разница между Nokogiri :: XML (File.open ()) и Nokogiri.parse (open ()) - PullRequest
0 голосов
/ 02 июля 2010

Я пытался открыть xml-файл, используя оба способа, но только последняя часть работала, когда я пытался использовать xpath.

например, doc = как в заголовке;

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

Одна вещь, которую я заметил, была, когда объект, который я открываю с использованием XML ::, является Nokogiri :: XML :: Document, в то время как последний был Nokogiri :: HTML :: Document

Есть комментарии?

Ответы [ 2 ]

3 голосов
/ 03 января 2011

Nokogiri использует простой тест, чтобы определить, является ли документ HTML или XML, когда вы вызываете универсальный метод Nokogiri.parse. Я видел, что возвращает неправильные результаты , и лучшее решение - это помочь Нокогири немного больше.

Вместо использования parse, используйте Nokogiri::XML('some xml string') или Nokogiri::HTML('some html string'), и это всегда будет делать правильно. См. Анализ документа HTML / XML .

XML по определению должен проверяться. Nokogiri полезен и попытается проанализировать недопустимый XML (иначе он не сможет разобрать HTML), но когда он обнаружит плохой XML, он отметит проблему, используя массив errors в качестве оболочки. Если вы знаете, источник документа надежный, тогда вы можете пропустить проверку, но это так просто, что вы могли бы сделать что-то вроде doc.errors.any? и отреагировать, если это правда.

Вы не говорите, какой тип XML вы пытаетесь проанализировать, но есть XML, а затем есть XML, который вы хотите. Ваш Xpath предполагает, что вы пытаетесь разобрать канал. Я столкнулся с таким количеством плохих XML-каналов, что не удивлен, что вы столкнулись с ошибками. Nokogiri пытается понять условия реального мира, но иногда этого недостаточно, и вы должны сказать Nokogiri быть более снисходительным при разборе. См. Опции для Nokogiri::XML, чтобы получить флаги.

Вы также говорите в своем комментарии к выбранному ответу, что документ хорошо открывается в браузере. Браузер не является хорошим показателем того, является ли документ действительным, потому что браузеры не выполняют валидацию, а вместо этого делают все возможное, чтобы представить что-то читабельное, даже если это не совсем правильно. Синтаксический анализатор, такой как Nokogiri, должен быть намного более жестким при разборе, потому что человеческий мозг не интерпретирует результаты. Код, извлекающий данные из XML, не так прост, как ошибки.

1 голос
/ 02 июля 2010

Nokogiri.parse анализирует документы HTML, а Nokogiri::XML ожидает действительный документ XML. Похоже, что при синтаксическом анализе XML ошибка не возникает, а создается пустой документ XML. попробуйте puts doc.to_s, вы, вероятно, увидите "<?xml version=\"1.0\"?>\n"

...