我发现一些帖子暗示你可以使用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
答案 0 :(得分:14)
不仅仅是你。你正在做的事情应该是正确的做法,但我从来没有运气好。据我所知,Nokogiri和libxml之间存在一些脱节,导致它无法加载SYSTEM
DTD或识别PUBLIC
DTD。如果你在XML文件中定义DTD,它将工作,但是使用XHTML DTD可以好运。
我建议的最好的方法是使用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) # => []
答案 1 :(得分:1)
如果DTD嵌入在XML中,它可以正常工作。因此,如果重组单个文件中的数据是可以的,无论是作为一般做法,还是仅用于临时使用,都可以解决您的问题。
我在Nokogiri项目中提出了一个问题:
https://github.com/sparklemotion/nokogiri/issues/440
JRuby Nokigiri的主要作者Yoko Harada说:
“仅供参考。主分支上的纯Java Nokogiri(尚未发布)没有此问题。”
我提交的问题包含指向最小示例文件和irb调用的链接以说明问题。