Как мне проверить XHTML с помощью nokogiri?
Я нашел несколько сообщений, ссылающихся на тот факт, что вы можете проверять XHTML на соответствие его DTD, используя драгоценный камень nokogiri. Хотя мне удалось использовать его для успешного анализа XHTML (поиск тегов "а" и т. Д.), Я изо всех сил пытаюсь проверить документы.
Для меня это:
doc = Nokogiri::XML(Net::HTTP.get(URI.parse("http://www.w3.org")))
puts doc.validate
в результате получается целая куча:
[
#<Nokogiri::XML::SyntaxError: No declaration for element html>,
#<Nokogiri::XML::SyntaxError: No declaration for attribute xmlns of element html>,
#<Nokogiri::XML::SyntaxError: No declaration for attribute lang of element html>,
#<Nokogiri::XML::SyntaxError: No declaration for attribute lang of element html>,
#<Nokogiri::XML::SyntaxError: No declaration for element head>,
#<Nokogiri::XML::SyntaxError: No declaration for attribute profile of element head
[repeat for every tag in the document.]
]
Так что я предполагаю, что это неправильный подход. Кажется, я не могу найти хороших примеров - кто-нибудь может подсказать, что я делаю неправильно?
Я использую ruby 1.8.6 на Mac OSX 10.5.8. Нокогири говорит мне:
nokogiri: 1.3.3
warnings: []
libxml:
compiled: 2.6.23
loaded: 2.6.23
binding: extension
2 ответа
Это не только ты. То, что вы делаете, должно быть правильным способом, но мне никогда не везло с этим. Насколько я могу судить, между Nokogiri и libxml есть некоторое разъединение, которое заставляет его не загружаться SYSTEM
DTD или распознать PUBLIC
ОТД. Это сработает, если вы определите DTD в XML-файле, но удачи вам сделать это с XHTML DTD.
Лучшее, что я могу порекомендовать, это использовать схемы для XHTML:
require 'nokogiri'
require 'open-uri'
doc = Nokogiri::XML(open('http://www.w3.org'))
xsd = Nokogiri::XML::Schema(open('http://www.w3.org/2002/08/xhtml/xhtml1-strict.xsd'))
#this is a true/false validation
xsd.valid?(doc) # => true
#this gives a listing of errors
xsd.validate(doc) # => []
Это работает нормально, если DTD встроен в XML. Поэтому, если реструктуризация данных в одном файле является приемлемой, либо в качестве общей практики, либо просто для временного использования, это решит вашу проблему.
Я подал вопрос в проект Nokogiri по адресу:
https://github.com/sparklemotion/nokogiri/issues/440
Йоко Харада, основной автор JRuby Nokigiri, сказал:
"Просто к вашему сведению. Чистая Java Nokogiri в основной ветке (еще не выпущена) не имеет этой проблемы".
Проблема, которую я подал, содержит ссылки на минимальные примеры файлов и вызовы irb, чтобы проиллюстрировать проблему.
- Кит