如何使用nokogirivalidationXHTML?

我发现一些post暗示你可以使用nokogiri gemvalidationXHTML对其DTD的影响。 虽然我已成功使用它来成功解析XHTML(寻找’a’标签等),但我正在努力validation文档。

对我来说,这个:

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

导致整堆:

 [ #, #, #, #, #, #<Nokogiri::XML::SyntaxError: No declaration for attribute profile of element head [repeat for every tag in the document.] ] 

所以我假设这不是正确的方法。 我似乎无法找到任何好的例子 – 任何人都可以建议我做错了吗?

我在Mac OSX 10.5.8上运行ruby 1.8.6。 Nokogiri告诉我:

 nokogiri: 1.3.3 warnings: [] libxml: compiled: 2.6.23 loaded: 2.6.23 binding: extension 

这不仅仅是你。 你正在做的事情应该是正确的做法,但我从来没有运气。 据我所知,Nokogiri和libxml之间存在一些脱节,导致它无法加载SYSTEM DTD或识别PUBLIC DTD。 如果您在XML文件中定义DTD, 它将起作用,但是使用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的主要作者Yoko Harada说:

“仅供参考。主分支上的纯Java Nokogiri(尚未发布)没有这个问题。”

我提交的问题包含最小示例文件和irb调用的链接以说明问题。

  • 基思