我发现一些帖子暗示你可以使用nokogiri gem验证XHTML对其DTD的影响.虽然我已成功使用它来成功解析XHTML(寻找'a'标签等),但我正在努力验证文档.
对我来说,这个:
doc = Nokogiri::XML(Net::HTTP.get(URI.parse("http://www.w3.org")))
puts doc.validate
Run Code Online (Sandbox Code Playgroud)
导致整堆:
[
#<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.]
]
Run Code Online (Sandbox Code Playgroud)
所以我假设这不是正确的方法.我似乎无法找到任何好的例子 - 任何人都可以建议我做错了吗?
我在Mac OSX 10.5.8上运行ruby 1.8.6.Nokogiri告诉我:
nokogiri: 1.3.3
warnings: []
libxml:
compiled: 2.6.23 …Run Code Online (Sandbox Code Playgroud) 这似乎是一个非常简单的问题,但是在Ruby中用最短/最惯用的方法重写这个问题是什么?
if variable == :a or variable == :b or variable == :c or variable == :d # etc.
Run Code Online (Sandbox Code Playgroud)
我看到了这个解决方案
if [:a, :b, :c, :d].include? variable
Run Code Online (Sandbox Code Playgroud)
但这并不总是在功能上等同 - 我相信Array#include?实际上看看列表中是否包含变量对象; 它没有考虑到对象可以实现自己的相等测试def ==(other).
正如下面有用的评论员所观察到的那样,这种解释是不正确的.include?确实使用==但它使用==数组中项目的方法.在我的例子中,它是符号,而不是==变量的方法.这就解释了为什么它不等同于我的第一个代码示例.
(举例来说,Rails的Mime::Type实现:request.format == :html可能返回true,但[:html].include?(request.format)会返回false,就像request.formatMime :: Type的实例一样,而不是符号.)
我到目前为止最好的是:
if [:a, :b, :c, :d].select {|f| variable == f}.any?
Run Code Online (Sandbox Code Playgroud)
但对我来说似乎有些麻烦.有没有人有更好的建议?