如何从lxml错误中获取更多信息?
问题描述:
因为我无法使用XSL IDE,所以我使用lxml编写了一个超简单的Python脚本,用给定的XSL转换来转换给定的XML文件,并将结果写入文件。如下(有删节):如何从lxml错误中获取更多信息?
p = XMLParser(huge_tree=True)
xml = etree.parse(xml_filename, parser=p)
xml_root = xml.getroot()
print(xml_root.tag)
xslt_root = etree.parse(xsl_filename)
transform = etree.XSLT(xslt_root)
newtext = transform(xml)
with open(output, 'w') as f:
f.write(str(newtext))
,我发现了以下错误:
“lxml.etree.XSLTApplyError:无法评估 '选择' 表达”
...但我在我的XSLT中有相当多的select
表达式。在仔细查看和隔离代码块之后,我仍然无法确定哪个select
失败,或者为什么。
没有试图调试代码,有没有一种方法可以从lxml中获取更多信息,如行号或来自失败表达式的引用?
答
aaaaaand当然,只要我真的花时间来发布问题,我偶然发现答案。
这可能是this question的重复,但我认为这里额外的好处是Python的一面。
链接的答案指出,每个解析器都包含一个您可以访问的错误日志。唯一的“诀窍”是捕捉这些错误,以便在创建日志后查看日志。
我做到了,正是如此(也许还很差,但它的工作):
import os
import lxml.etree as etree
from lxml.etree import XMLParser
import sys
xml_filename = '(some path to an XML file)'
xsl_filename = '(some path to an XSL file)'
output = '(some path to a file)'
p = XMLParser(huge_tree=True)
xml = etree.parse(xml_filename, parser=p)
xml_root = xml.getroot()
xslt_root = etree.parse(xsl_filename)
transform = etree.XSLT(xslt_root)
newtext = None
try:
newtext = transform(xml)
with open(output, 'w') as f:
f.write(str(newtext))
except:
for error in transform.error_log:
print(error.message, error.line)
此日志中的信息比打印到控制台更具描述性的,而“行”元素将指向你发生故障的行号。
请更新您的代码以完全编译,包括所有'import'行。而且,没有任何地方使用'lxml.etree.XSLT()'配置XSLT对象,但是'转换'。并且可以引用完整的回溯作为一条线。 – Parfait
是的,XSLT对象配置为'xslt_root = etree.parse(xsl_filename)' – Matt
这就是XSLT文档被解析!无论如何,你的答案比你定义的* transform *(XSLT对象)的问题更加丰富和可编译:'transform = etree.XSLT(xslt_root)' – Parfait