如何从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中获取更多信息,如行号或来自失败表达式的引用?

+0

请更新您的代码以完全编译,包括所有'import'行。而且,没有任何地方使用'lxml.etree.XSLT()'配置XSLT对象,但是'转换'。并且可以引用完整的回溯作为一条线。 – Parfait

+0

是的,XSLT对象配置为'xslt_root = etree.parse(xsl_filename)' – Matt

+0

这就是XSLT文档被解析!无论如何,你的答案比你定义的* transform *(XSLT对象)的问题更加丰富和可编译:'transform = etree.XSLT(xslt_root)' – Parfait

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) 

此日志中的信息比打印到控制台更具描述性的,而“行”元素将指向你发生故障的行号。