12

我发现一些帖子暗示您可以使用 nokogiri gem 验证 XHTML 与它的 DTD。虽然我已经成功地使用它来解析 XHTML(寻找“a”标签等),但我正在努力验证文档。

对我来说,这个:

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
4

2 回答 2

14

不只是你。你所做的应该是正确的方法,但我从来没有运气。据我所知,Nokogiri 和 libxml 之间存在一些断开连接,导致它无法加载SYSTEMDTD 或识别PUBLICDTD。如果您在 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)  # => []
于 2009-08-17T17:54:01.963 回答
1

如果 DTD 嵌入在 XML 中,它就可以正常工作。因此,如果在单个文件中重组数据是可以的,无论是作为一般做法,还是仅用于临时使用,那都可以解决您的问题。

我在 Nokogiri 项目中提交了一个问题:

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

JRuby Nokigiri 的主要作者 Yoko Harada 说:

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

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

  • 基思
于 2011-03-31T16:02:19.513 回答