2009-08-17 10 views
12

Znalazłem kilka wpisów odnoszących się do faktu, że możesz zwalidować XHTML w stosunku do jego DTD, używając klejnotu nokogiri. Chociaż udało mi się go wykorzystać do pomyślnego przeanalizowania XHTML (szukając tagów "a" itp.), Walczę o weryfikację dokumentów.Jak sprawdzić poprawność XHTML za pomocą nokogiri?

Dla mnie to:

doc = Nokogiri::XML(Net::HTTP.get(URI.parse("http://www.w3.org"))) 
puts doc.validate 

wyniki w całej stercie:

[ 
#<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.] 
] 

Więc jestem przy założeniu, że nie jest właściwe podejście. Nie mogę znaleźć dobrych przykładów - czy ktoś może zasugerować, co robię źle?

biegnę Ruby 1.8.6 na Mac OSX 10.5.8. Nokogiri mówi:

nokogiri: 1.3.3 
warnings: [] 

libxml: 
    compiled: 2.6.23 
    loaded: 2.6.23 
    binding: extension 

Odpowiedz

14

To nie tylko ty. To, co robisz, powinno być właściwą drogą, ale nigdy nie miałem z tym szczęścia. O ile mogę powiedzieć, istnieje pewne rozłączenie między Nokogiri i libxml, które powoduje, że nie ładuje się DTDs lub rozpoznaje DTD z . Jeśli zdefiniujesz DTD w pliku XML, zadziała to, jeśli zdefiniujesz DTD, ale powodzenia robisz z DTD XHTML.

Najlepszą rzeczą, którą mogę polecić jest użycie schemas for XHTML zamiast:

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) # => [] 
+0

To świetnie - to z pewnością produkujących mi rozsądne wyglądające rezultaty (na pierwszy rzut oka!). Chociaż dziwnie, niektóre strony mam potwierdzające stosy plonu „ZAIMPLEMENTOWANE bloku przy xmlschemas.c: 27443” Ostrzeżenia - ale potem przystąpić do zgłaszania są ważne bez błędów. Nie doszedłem do sedna schematów, które są i nie są w tym momencie. – NeilS

1

Działa ok, jeśli DTD jest osadzony w XML. Jeśli więc restrukturyzacja danych w jednym pliku jest dobra, albo jako ogólna praktyka, albo tylko tymczasowo, rozwiążesz problem.

I złożony problem z projektem Nokogiri w:

https://github.com/sparklemotion/nokogiri/issues/440

Yoko Harada, pierwotny autor jruby Nokigiri, powiedział:

„Just FYI Czysta Java Nokogiri na gałęzi master (nie. wydany) nie ma tego problemu. "

Kwestia I złożony zawiera linki do minimalnych przykładowych plików i połączeń IRB do zilustrowania problemu.

  • Keith