2013-04-02 61 views
1

我使用lxml來解析包含xi:include元素的文件,並且我正在使用xinclude()解析包含。lxml,xi:include和原始文件

給定一個元素,是否有任何方法來識別該元素最初出現的文件和源代碼行?

例如:

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

的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