2009-08-17 65 views
12

我发现了几个帖子,暗示你可以使用nokogiri gem验证XHTML是否针对其DTD。虽然我设法使用它来成功解析XHTML(寻找'a'标签等),但我正在努力验证文档。如何使用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.] 
] 

所以我假设这不是正确的做法。我似乎无法找到任何好例子 - 任何人都可以提出我做错了什么?

我在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 

回答

14

这不仅仅是你。你在做什么应该是正确的做法,但我从来没有碰运气。据我所知,在Nokogiri和libxml之间存在一些断开连接,导致它不会加载SYSTEM DTD,或者识别PUBLIC DTD。它工作,如果你在XML文件中定义的DTD,但祝你好运与XHTML DTDs。

我可以推荐的最好的事情就是使用schemas for 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) # => [] 
+0

这是伟大的 - 这当然是我制作合理的妆效(一目了然!)。 虽然,奇怪的是,我正在验证的一些页面产生“未实现的块在xmlschemas.c:27443”的警告 - 但是然后继续报告它们是有效的,没有错误。我还没有达到哪种模式的底部,现在还没有。 – NeilS 2009-08-18 09:04:17

1

如果DTD嵌入到XML它工作正常。因此,如果在单个文件中重新构建数据是正常的,无论是作为一般惯例,还是临时使用,都可以解决您的问题。

我在提交的问题与引入nokogiri项目:

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

洋子原田,JRuby的Nokigiri的主要作者,他表示:

“仅供参考纯Java引入nokogiri在主分支(不是。但是已经发布)没有这个问题。“

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

  • 基思