Ruby Nokogiri SAX解析器在">"处截断字符串(又名">")

时间:2014-04-10 18:37:29

标签: ruby xml xml-parsing nokogiri sax

后台:我使用Ruby的Nokogiri gem来解析XML文件。我遇到的问题是,当字符串包含&gt;时,SAX解析器会返回不完整的结果,><element>PART1PART2</element> #=> returns "PART1PART2" <element>PART3&gt;PART4</element> #=> returns "PART3" 的HTML编码。例如:

require 'nokogiri'
class MySample < Nokogiri::XML::SAX::Document
  def characters(string)
    puts string
  end
end
# Create a new parser
parser = Nokogiri::XML::SAX::Parser.new(MySample.new)
# Feed the parser some XML
parser.parse_file(ARGV[0])

我的解析器看起来像这样:

>

研究:如果字符串包含>,那么Nokogiri认为该字符串的结尾。在字符串中使用&gt;将被视为格式不正确的XML。但是,我的XML格式正确,但Nokogiri认为&gt;标记了字符串的结尾。这意味着Nokogiri在解析字符串之前解释HTML(将>转换为&gt;)。

问题:为什么Nokogiri会解释&gt;的HTML,如何确保它解析完整的字符串?


1年更新(FWIW)

自从我第一次发布这个问题以来已经过去了一年多,而且此时我还没有找到对我原来问题的确切答案。因此,我认为我会为将来遇到这篇文章的人提供一些更新。请记住,我严格来说是SAX解析,而不是DOM解析。

重点:

  • 最初的问题是关于Nokogiri v1.6.1。最新版本(撰写本文时)是v1.6.6,但问题仍未解决。

  • 但是这个问题有一个解决方法(请参阅下面的matt注释),但如果并非所有字符串的格式都相同(例如一个字符串),那么实现起来会很棘手包含&gt;一次,另一个字符串包含&gt;两次,等等。)

  • 我简要地测试了另一个名为Ox的Ruby解析器,发现它与Nokogiri没有相同的问题。实际上它正确处理包含>的字符串。此外,它还可以处理包含&gt;的字符串。作为奖励,it appears to perform faster than Nokogiri (but it's not without its faults)

底线:

如果你和Nokogiri有类似的问题,那么我建议你选择牛作为替代品。我不会争辩说一颗宝石比另一颗宝石更好(这不是它的用途)。但是,我可以保证Ox能够处理包含>和/或{{1}}的字符串。

1 个答案:

答案 0 :(得分:0)

您没有说明为什么要尝试使用SAX解析器。 Nokogiri在使用DOM解析器解析文档时正确处理文档:

require 'nokogiri'

doc = Nokogiri::XML(<<EOT)
<root>
  <element>PART1PART2</element>
  <element>PART3&gt;PART4</element>
</root>
EOT

puts doc.to_xml
# >> <?xml version="1.0"?>
# >> <root>
# >>   <element>PART1PART2</element>
# >>   <element>PART3&gt;PART4</element>
# >> </root>

您可能需要与their mail-list上的开发人员联系。