后台:我使用Ruby的Nokogiri gem来解析XML文件。我遇到的问题是,当字符串包含>
时,SAX解析器会返回不完整的结果,>
是<element>PART1PART2</element> #=> returns "PART1PART2"
<element>PART3>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认为该字符串的结尾。在字符串中使用>
将被视为格式不正确的XML。但是,我的XML格式正确,但Nokogiri认为>
标记了字符串的结尾。这意味着Nokogiri在解析字符串之前解释HTML(将>
转换为>
)。
问题:为什么Nokogiri会解释>
的HTML,如何确保它解析完整的字符串?
1年更新(FWIW)
自从我第一次发布这个问题以来已经过去了一年多,而且此时我还没有找到对我原来问题的确切答案。因此,我认为我会为将来遇到这篇文章的人提供一些更新。请记住,我严格来说是SAX解析,而不是DOM解析。
重点:
最初的问题是关于Nokogiri v1.6.1。最新版本(撰写本文时)是v1.6.6,但问题仍未解决。
但是这个问题有一个解决方法(请参阅下面的matt注释),但如果并非所有字符串的格式都相同(例如一个字符串),那么实现起来会很棘手包含>
一次,另一个字符串包含>
两次,等等。)
我简要地测试了另一个名为Ox的Ruby解析器,发现它与Nokogiri没有相同的问题。实际上它正确处理包含>
的字符串。此外,它还可以处理包含>
的字符串。作为奖励,it appears to perform faster than Nokogiri (but it's not without its faults)。
底线:
如果你和Nokogiri有类似的问题,那么我建议你选择牛作为替代品。我不会争辩说一颗宝石比另一颗宝石更好(这不是它的用途)。但是,我可以保证Ox能够处理包含>
和/或{{1}}的字符串。
答案 0 :(得分:0)
您没有说明为什么要尝试使用SAX解析器。 Nokogiri在使用DOM解析器解析文档时正确处理文档:
require 'nokogiri'
doc = Nokogiri::XML(<<EOT)
<root>
<element>PART1PART2</element>
<element>PART3>PART4</element>
</root>
EOT
puts doc.to_xml
# >> <?xml version="1.0"?>
# >> <root>
# >> <element>PART1PART2</element>
# >> <element>PART3>PART4</element>
# >> </root>
您可能需要与their mail-list上的开发人员联系。