Ruby 如何制作Nokogiri';s SAX解析器不那么严格吗?

Ruby 如何制作Nokogiri';s SAX解析器不那么严格吗?,ruby,nokogiri,Ruby,Nokogiri,我正在处理非常大的XML文件,因此需要使用SAX/事件XML解析器。Nokogiri::XML::SAX似乎是一个明显的选择,但是,SAX解析器似乎会遇到一些小错误,即使是常规XML解析器从中恢复也没有问题 在下面的示例中,的url属性有一个&,应该真正转义到&。Nokogiri::XML仍然能够解析中的元素,但Nokogiri::XML::SAX似乎放弃了,并且从未为中的元素触发事件 然而,我得到: EntityRef: expecting ';' 0 1 有没有办法让Nokogiri

我正在处理非常大的XML文件,因此需要使用SAX/事件XML解析器。Nokogiri::XML::SAX似乎是一个明显的选择,但是,SAX解析器似乎会遇到一些小错误,即使是常规XML解析器从中恢复也没有问题

在下面的示例中,
url
属性有一个
&
,应该真正转义到
&。Nokogiri::XML仍然能够解析
中的元素,但Nokogiri::XML::SAX似乎放弃了,并且从未为
中的元素触发事件

然而,我得到:

EntityRef: expecting ';'
0
1

有没有办法让Nokogiri忽略这些小错误?对于Ruby中的SAX/push/pull/evented XML解析,有没有更好的选项可以忽略这些错误?

改用Nokogiri的HTML SAX解析器

换行

parser = Nokogiri::XML::SAX::Parser.new(self)
parser = Nokogiri::HTML::SAX::Parser.new(self)
这条线

parser = Nokogiri::XML::SAX::Parser.new(self)
parser = Nokogiri::HTML::SAX::Parser.new(self)
HTML解析器显然以恢复模式运行libxml,并且能够从错误中恢复。这允许示例输出所需的1/1,尽管对非标准的“html”标记有些抱怨

更新


事实证明,这适用于我设计的示例,但只要
Nokogiri::HTML::SAX::Parser#parse
被传递一个
IO
而不是
String
,它就会像XML版本一样出现错误。我无法将文件加载到内存中。。。这违背了使用SAX解析器的全部目的。所以,不要接受我自己的答案。

SAX解析器的行为有点不同,您实际上可以将其设置为从任何错误中恢复。您还可以使用错误处理程序方法来处理特定的错误

class MyDoc < Nokogiri::XML::SAX::Document
  def error(error)
    puts "An error occurred: #{error}"
  end

  def start_element(name, attributes = [])
    puts "found a #{name}"
  end
end

parser = Nokogiri::HTML::SAX::Parser.new(MyDoc.new)
parser.parse(open(url)) do |ctx|
  ctx.recovery = true
end
classmydoc
+1以实现良好的代码共享..请参见@ArupRakshit您是否有在SAX解析器中使用
ParseOptions
的示例?这些示例适用于非SAX解析器,我似乎无法将任何选项传递给SAX解析器。
class MyDoc < Nokogiri::XML::SAX::Document
  def error(error)
    puts "An error occurred: #{error}"
  end

  def start_element(name, attributes = [])
    puts "found a #{name}"
  end
end

parser = Nokogiri::HTML::SAX::Parser.new(MyDoc.new)
parser.parse(open(url)) do |ctx|
  ctx.recovery = true
end