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
Это связано с тем, как работает метод синтаксического анализа Нокогири . Вот источник:
# 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
.
Отвечая на эту часть вашего вопроса:
Я думал, что могу написать несколько тестов для для определения типа, но потом я столкнулся с тем, что 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
Уродливо, я знаю, но это помогло.