XSLT 1.0 (xsltproc) - 无法解析巨大的 XML

Posted

技术标签:

【中文标题】XSLT 1.0 (xsltproc) - 无法解析巨大的 XML【英文标题】:XSLT 1.0 (xsltproc) - Unable to Parse Huge XML 【发布时间】:2020-04-06 09:35:31 【问题描述】:

我正在尝试使用 xsltproc 解析一个长度为 13,00,000 行、大小为 56 MB 的输入 xml 文件。我收到以下错误:

input.xml:245393: parser error : internal error: Huge input lookup
              "description" : "List of values for possible department codes"
                          ^
unable to parse input.xml

我的 xsltproc 能够处理 9,30,000 行、大小为 48 MB 的 xml 文件。

事实上,我尝试通过删除不必要的部分将 xml 行数减少到 600,000 行。不过,同样的错误,这很奇怪,因为它能够解析 900,000 但不能解析 600,000。

我该如何解决这个问题?

【问题讨论】:

gitlab.gnome.org/GNOME/libxml2/blob/master/include/libxml/… 中定义了一些查找限制,但 maxLength30 听起来很像 XSD 架构相关问题。该文档是否指的是模式?某些xsl:key 处理是否发生错误? "maxLength:30" 可以忽略。它只是我输入 xml 中的一个字符串。有没有办法可以增加 XML_MAX_LOOKUP_LIMIT?我尝试将 xml 行减少到 600,000。不过,同样的错误,这很奇怪,因为它能够解析 900,000 但不能解析 600,000。 编辑问题以避免混淆 48Mb 并不是一个巨大的文件。如今,“巨大”更像是 48Gb。 ***.com/a/32115337/252228 建议您可以编辑 libxml2 的源代码以设置 XML_PARSE_HUGE 解析器选项(然后我认为禁用任何通常默认设置的基于安全的限制/限制)。然后你需要重新编译。或者尝试使用其中一种语言,例如使用 libxml2 的 Python 或 php,它们似乎有选项(例如 lxml.de/parsing.html#parser-options 中的 lxml 声明 huge_tree)在运行时禁用基于安全的限制。 【参考方案1】:

使用 Oxygen XML Editor (Xalan) 解决了我的问题。

【讨论】:

以上是关于XSLT 1.0 (xsltproc) - 无法解析巨大的 XML的主要内容,如果未能解决你的问题,请参考以下文章

使用 xsltproc 转义 XML 属性的值

我无法理解 XSLT 1.0 Muenchian 分组

XSLT - 在多个文件时选择唯一元素

带有文本输出的 XSLT 空白控件

xslt 1.0中的嵌套分组

Muenchian 分组 XSLT 1.0 多重分组