【问题标题】:Ruby LibXML skip large nodesRuby LibXML 跳过大节点
【发布时间】:2014-12-11 00:55:51
【问题描述】:

我有一个 xml 文件,它有一个非常大的文本节点 (>10 MB)。读取文件时,是否可以跳过(忽略)该节点?

我尝试了以下方法:

 reader = XML::Reader.io(path)
 while reader.read do
  next if reader.name.eql?('huge-node')
 end

但这仍然会导致错误parser error : xmlSAX2Characters: huge text node

我能想到的唯一其他解决方案是首先将文件作为字符串读取并通过gsub删除巨大的节点,然后解析文件。但是,这种方法似乎效率很低。

【问题讨论】:

  • 您绝对需要使用 SAX 解析器吗?
  • 啊,好的。这无疑使问题更具挑战性。感谢您的澄清。
  • 如果您只想绕过“巨大的文本节点”错误,请传递HUGE 选项。
  • @nwellnhof 感谢您指出这一点;但是,我没有使用 nokogiri。
  • 然后试试 libxml-ruby 的HUGE 选项。

标签: ruby xml-parsing libxml2


【解决方案1】:

这可能是因为当您尝试跳过它时,它已经读取了节点。根据documentation#read方法:

reader.read -> nil|true|false
Causes the reader to move to the next node in the stream, exposing its properties.

Returns true if a node was successfully read or false if there are no more nodes to read. On errors, an exception is raised.

在调用#read 方法之前,您需要跳过该节点。我敢肯定有很多方法可以做到这一点,但看起来这个库不支持 XPath 表达式,或者我会建议类似的东西。

编辑:问题已得到澄清,因此 SAX 解析器是解决方案的必需部分。鉴于此限制,我已删除无用的链接。

【讨论】:

  • 感谢您的回答。这说明了为什么我的尝试没有成功。在调用 #read 方法之前如何跳过节点的任何其他想法?
  • 也许你可以捕捉到错误然后调用reader.next?我不确定这是否可行,因为我没有这个库或有代表性的 XML 文件来测试。
  • 还有一些 options 可以传递给解析器,这可能会有所帮助。我认为最有趣的是RECOVER
  • 谢谢,我去看看!
  • @diasks2 你解决过这个问题吗?
【解决方案2】:

您不必跳过该节点。原因是从 2.7.3 版本开始,libxml 将单个文本节点的最大大小限制为 10MB。 可以使用新选项 XML_PARSE_HUGE 删除此限制。

举个例子:

# Reads entire file into a string
$result = file_get_contents("https://www.ncbi.nlm.nih.gov/gene/68943?report=xml&format=text");
# Returns the xml string into an object
$xml = simplexml_load_string($result, 'SimpleXMLElement', LIBXML_COMPACT | LIBXML_PARSEHUGE);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多