我正在使用lxml来解析包含xi:include元素的文件,并且我使用xinclude()来解析包含。
给定一个元素,有没有办法识别元素最初出现的文件和源代码?
例如:
from lxml import etree
doc = etree.parse('file.xml')
doc.xinclude()
xpath_expression = ...
elt = doc.xpath(xpath_expression)
# Print file name and source line of `elt` location
答案 0 :(得分:0)
xinclude扩展会将xml:base属性添加到顶级展开元素, 并且还为子节点更新了elt.base和elt.sourceline,因此:
print elt.base, elt.sourceline
会给你你想要的东西。
如果elt不是xinclude扩展的一部分,那么elt.base将指向基数 document('file.xml')和elt.sourceline将是该文件中的行号。 (注意,sourceline通常似乎实际上指向元素标记的行 结束,而不是它开始的行,如果元素在多行上,就像 验证错误消息通常指向发生错误的结束标记。 )
您可以找到初始的xincluded元素,并使用以下方法检查:
xels = doc.xpath( '//*[@xml:base] )
for x in xels:
print x.tag, x.base, x.sourceline
for c in x.getchildren():
print c.tag, c.base, c.sourceline