Как я могу заставить Nokogiri анализировать и возвращать XML-документ?

PL / SQL позволяет объявлять переменные и имена функций как ключевые слова. Следующее является компилируемым PL / SQL:

create or replace 
  function function 
  return number  as
  return number;
begin 
  function.return := 4;
  return   return;
end function;
/

Это создало функцию с именем function. Позже:

SQL> select function from dual;

  FUNCTION
----------
         4
5
задан the Tin Man 9 January 2013 в 20:55
поделиться

2 ответа

Это связано с тем, как работает метод синтаксического анализа Нокогири . Вот источник:

# File lib/nokogiri.rb, line 55
    def parse string, url = nil, encoding = nil, options = nil
      doc =
        if string =~ /^\s*<[^Hh>]*html/i # Probably html
          Nokogiri::HTML::Document.parse(string, url, encoding, options || XML::ParseOptions::DEFAULT_HTML)
        else
          Nokogiri::XML::Document.parse(string, url, encoding, options || XML::ParseOptions::DEFAULT_XML)
        end
      yield doc if block_given?
      doc
    end

Ключ - это строка if string = ~ / ^ \ s * <[^ Hh>] * html / i # Вероятно, html . Когда вы просто используете open , он возвращает объект, который не работает с регулярным выражением, поэтому всегда возвращает false. С другой стороны, read возвращает строку, поэтому ее можно рассматривать как HTML. В данном случае это так, потому что оно соответствует этому регулярному выражению. Вот начало этой строки:

<!DOCTYPE html PUBLIC

Регулярное выражение сопоставляет «! DOCTYPE» с [^ Hh>] * , а затем сопоставляет «html», предполагая, что это HTML. Почему кто-то выбрал это регулярное выражение, чтобы определить, является ли файл HTML, вне меня. В этом регулярном выражении файл, который начинается с тега вроде < Определенно-не-html> считается HTML, но считается XML. Вероятно, вам лучше держаться подальше от этой глупой функции и напрямую вызывать Nokogiri :: HTML :: Document # parse или Nokogiri :: XML :: Document # parse .

13
ответ дан 18 December 2019 в 09:09
поделиться

Отвечая на эту часть вашего вопроса:

Я думал, что могу написать несколько тестов для для определения типа, но потом я столкнулся с тем, что xpaths не находит элементы, но обычный поиск работает:

Я только что столкнулся с этой проблемой, используя nokogiri для парсинга atom feed. Проблема, похоже, связана с анонимным объявлением пространства имен:

<feed xmlns="http://www.w3.org/2005/Atom">

Удаление объявления xmlns из исходного xml позволило бы Nokogiri искать с помощью xpath, как обычно. Удаление этого объявления из фида, очевидно, не было вариантом, поэтому вместо этого я просто удалил пространства имен из документа после парсинга. например:

doc = Nokogiri.parse(open('http://feeds.feedburner.com/RidingRails'))
doc.remove_namespaces!
doc.xpath('/feed/entry').length

Уродливо, я знаю, но это помогло.

5
ответ дан 18 December 2019 в 09:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: