Я использую lxml для анализа файла, содержащего элементы xi: include, и я разрешаю 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
Расширение xinclude добавит атрибут xml: base к расширенному элементу верхнего уровня, а также elt.base и elt.sourceline также будут обновлены для дочерних узлов, так что:
print elt.base, elt.sourceline
даст вам то, что вы хотите.
Если elt не является частью расширения xinclude, то elt.base укажет на базовый документ ('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