Как проверить 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
Ответы
Ответ 1
Это не только ты. То, что вы делаете, должно быть правильным способом сделать это, но мне никогда не удавалось с этим справиться. Насколько я могу судить, там где-то между Nokogiri и libxml отключается, что заставляет его не загружать DTD SYSTEM
или распознавать DTD DT1. Он будет работать, если вы определите DTD в XML файле, но удачи вам это удастся с DTD XHTML.
Лучше всего я рекомендую использовать схемы для 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) # => []
Ответ 2
Он работает нормально, если DTD встроен в XML. Поэтому, если реструктуризация данных в одном файле в порядке, либо в качестве общей практики, либо только для временного использования, это поможет решить вашу проблему.
Я подал иск в проект Nokogiri по адресу:
https://github.com/sparklemotion/nokogiri/issues/440
Йоко Харада, главный автор JRuby Nokigiri, сказал:
"Просто FYI. Чистая Java Nokogiri на главной ветке (еще не выпущена) не имеет этой проблемы".
Проблема, которую я написал, содержит ссылки на файлы минимального примера и irb-вызовы, чтобы проиллюстрировать проблему.