XSLT 1.0 (xsltproc) - 无法解析巨大 XML
XSLT 1.0 (xsltproc) - Unable to Parse Huge XML
我正在尝试使用 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 能够处理一个 xml 文件,该文件长 9,30,000 行,大小为 48 MB。
事实上,我尝试通过删除不必要的部分将 xml 行减少到 600,000。仍然是同样的错误,这很奇怪,因为它能够解析 900,000 而不是 600,000。
如何解决这个问题?
使用氧气 XML 编辑器 (Xalan) 解决了我的问题。
根据此代码段在 Python 中编写您自己的 xsltproc:
import argparse
from lxml import etree
parser = argparse.ArgumentParser()
parser.add_argument('stylesheet', help='XSLT style sheet', type=argparse.FileType('r', encoding='utf-8'))
parser.add_argument('input', help='XML input file(s)', nargs='*', type=argparse.FileType('r', encoding='utf-8'))
parser.add_argument('--output', help='The output file to create.', type=argparse.FileType('wb'))
args = parser.parse_args()
transform = etree.XSLT(etree.parse(args.stylesheet))
xml_parser = etree.XMLParser(huge_tree=True)
for xml in args.input:
transform(etree.parse(xml, xml_parser)).write_output(args.output)
这使用了lxml as suggested in this answer.
huge_tree=True
参数在 libxml2 中设置相应的解析器选项,从而使其能够处理大文件。有关详细信息,请参阅 Parser options。
libxslt 1.1.35 向 xsltproc
添加了一个 --huge
选项,它禁用了一些内部限制,例如 XML_MAX_LOOKUP_LIMIT
.
我正在尝试使用 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 能够处理一个 xml 文件,该文件长 9,30,000 行,大小为 48 MB。
事实上,我尝试通过删除不必要的部分将 xml 行减少到 600,000。仍然是同样的错误,这很奇怪,因为它能够解析 900,000 而不是 600,000。
如何解决这个问题?
使用氧气 XML 编辑器 (Xalan) 解决了我的问题。
根据此代码段在 Python 中编写您自己的 xsltproc:
import argparse
from lxml import etree
parser = argparse.ArgumentParser()
parser.add_argument('stylesheet', help='XSLT style sheet', type=argparse.FileType('r', encoding='utf-8'))
parser.add_argument('input', help='XML input file(s)', nargs='*', type=argparse.FileType('r', encoding='utf-8'))
parser.add_argument('--output', help='The output file to create.', type=argparse.FileType('wb'))
args = parser.parse_args()
transform = etree.XSLT(etree.parse(args.stylesheet))
xml_parser = etree.XMLParser(huge_tree=True)
for xml in args.input:
transform(etree.parse(xml, xml_parser)).write_output(args.output)
这使用了lxml as suggested in this answer.
huge_tree=True
参数在 libxml2 中设置相应的解析器选项,从而使其能够处理大文件。有关详细信息,请参阅 Parser options。
libxslt 1.1.35 向 xsltproc
添加了一个 --huge
选项,它禁用了一些内部限制,例如 XML_MAX_LOOKUP_LIMIT
.