Подтвердить что ты не робот

Как проверить 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
4b9b3361

Ответ 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-вызовы, чтобы проиллюстрировать проблему.

  • Кейт