如何从lxml错误中获取更多信息?

时间:2017-07-24 16:25:10

标签: python xslt lxml

因为我无法使用XSL IDE,所以我使用lxml编写了一个超级简单的Python脚本,用给定的XSL转换转换给定的XML文件,并将结果写入文件。如下(删节):

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:无法评估'select'表达式”

...但我的XSLT中有很多select个表达式。在仔细查看并隔离了代码块之后,我仍然不知道哪个select失败了,或者为什么会失败。

如果没有尝试调试代码,有没有办法从lxml中获取更多信息,比如来自失败表达式的行号或引用?

1 个答案:

答案 0 :(得分:2)

当然,只要我真的花时间发布问题,我就会偶然发现答案。

这可能是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)

此日志中的消息比打印到控制台的消息更具描述性,并且" line" element将指向发生故障的行号。