Ruby Nokogiri SAX解析器将字符串截断为&;燃气轮机&引用;(又名“";”

Ruby Nokogiri SAX解析器将字符串截断为&;燃气轮机&引用;(又名“";”,ruby,xml,xml-parsing,nokogiri,sax,Ruby,Xml,Xml Parsing,Nokogiri,Sax,背景:我正在使用Ruby的gem解析XML文件。我遇到的问题是,当字符串包含时,SAX解析器返回一个不完整的结果,这是的HTML编码。例如: <element>PART1PART2</element> #=> returns "PART1PART2" <element>PART3&gt;PART4</element> #=> returns "PART3" PART1PART2#=>返回“PART1PART2” PART3PA

背景:我正在使用Ruby的gem解析XML文件。我遇到的问题是,当字符串包含
时,SAX解析器返回一个不完整的结果,这是
的HTML编码。例如:

<element>PART1PART2</element> #=> returns "PART1PART2"
<element>PART3&gt;PART4</element> #=> returns "PART3"
PART1PART2#=>返回“PART1PART2”
PART3PART4#=>返回“PART3”
我的解析器如下所示:

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”
类MySample
研究:如果字符串包含
,则Nokogiri认为这是字符串的结尾。在字符串中包含
将被视为格式不良的XML。然而,我的XML格式正确,但Nokogiri认为
标志着字符串的结束。这意味着Nokogiri在解析字符串之前正在解释HTML(将
转换为

问题:为什么Nokogiri解释
的HTML,我如何确保它解析完整的字符串


1年更新(FWIW)

自从我第一次发布这个问题已经一年多了,在这个时候,我还没有找到一个关于我最初问题的明确答案。因此,我想我会为将来遇到这篇文章的人提供一些更新。请记住,我严格地说是SAX解析,而不是DOM解析

要点:

  • 最初的问题与Nokogiri v1.6.1有关。最新的版本(在撰写本文时)是v1.6.6,但这个问题仍然没有得到解决

  • 但是,这个问题有一个解决方法(请参阅下面的注释),但是如果不是所有字符串都以相同的方式格式化(例如,一个字符串包含
    一次,另一个字符串包含
    两次,等等),那么实现起来会很困难

  • 我简要测试了另一个名为Ruby的解析器,发现它与Nokogiri没有相同的问题。实际上,它正确地处理包含
    的字符串。此外,它还可以处理包含
    的字符串。作为奖励

底线:


如果你和Nokogiri有类似的问题,那么我建议你去看看Ox作为一个可能的选择。我不会争辩说一个宝石比另一个好(这不是它的目的)。但是,我可以保证Ox能够处理包含
和/或

的字符串。您没有说明为什么要使用SAX解析器。使用DOM解析器解析文档时,Nokogiri会正确处理文档:

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>
需要“nokogiri”
doc=Nokogiri::XML(
# >> 
#>>第1部分第2部分
#>>第三部分第四部分
# >> 

您可能希望与开发人员一起检查。

+1,以便以友好的方式提问。。这对我来说没什么问题。请注意,在本例中(至少对我来说),它被调用了三次–一次使用
PART3
,一次使用实体(
),一次使用
PART4
,因此它看起来像Nokogiri(或libxml)正在围绕实体拆分字符串。是否只查看第一次调用时传递的内容?您需要缓冲对
字符的多次调用以形成完整的字符串。您完全正确。这是我最终实现的解决方法,但并不理想。当每个字符串都具有同样数量的
,但我的字符串没有。我让它工作了,但它非常难看,所以我希望关闭HTML解释以使事情更干净。另外:
在这里实际上是有效的(
不会,但code>
是可以的)。你是对的。但是,他说,“大于字符是合法的,但替换它是一个好习惯。”我采取了这一预防措施,所以(除非我完全遗漏了什么)我有点失望,因为Nokogiri没有相应地处理它。这一点很好。我忘了提到我正在解析的XML文件太大,无法用DOM解析器加载到内存中。