2014-11-14 105 views
0

是否可以使用行號和python lxml庫生成XPath?使用lxml爲特定行生成XPath

背景:我們在文檔中(其中不XPath的,但零件)的引用,我想找到一個特定元素的所有引用(在特定的線)

enter code here 

<root> 
    <element> 
    <name>Element1</name> 
    <contains> 
     <element> 
     <name>color</name> 
     <value-ref>/Colors/red</value-ref> 
     </element> 
    </contains> 
    </element> 
    <element> 
    <name>Colors</name> 
    <contains> 
     <element> 
     <name>red</name> 
     <value>0xFF0000</value> 
     </element> 
     <element> 
     <name>blue</name>  <!-- the line I'd like to get an Xpath for --> 
     <value>0x0000FF</value> 
     </element> 
    </contains> 
    </element> 
</root> 

進出XPath我將在value-ref中創建一個表達式(這可以通過正則表達式來完成)

+0

請提供一個可重現的例子。 – alecxe 2014-11-14 14:22:06

回答

1

我現在用

etree.iter() 

遍歷所有元素,然後比較

element.sourceline 

並將其與我正在查找的行進行比較。現在我有我正在尋找的元素,並可以繼續生成如上所述的路徑。

謝謝。

0

您可能會做一些解析文檔,製作文檔中所有元素的映射及其底層行號(使用lxml Element對象的sourceline屬性),然後從那裏開始工作。但如果沒有關於你想要做什麼的性質的更多解釋,就很難更具體。

編輯:

我還是不太明白的問題,但如果它是有用的,這是一個使用LXML和顯示,無論是位置路徑(的XPath)和行號中的每個元素一些Python代碼的例如DOC:

import lxml.etree 

doc = lxml.etree.parse('test.xml') 
tree = lxml.etree.ElementTree(doc.getroot()) 
for e in tree.xpath('.//*'): 
    print(tree.getpath(e), '-', e.sourceline) 
+0

好吧,我儘量保持這個例子儘可能簡單。我試圖做的是瀏覽AUTOSAR xml文件。它們可以非常大,大於150000行,它們包含這些鏈接。我使用vim和lxml來查找引用的元素,它工作得很整潔。但有時我想找到所有引用當前元素的元素(由當前行/ linennumber標識)。希望你能明白我的意思。 – m42e 2014-11-14 19:58:10

+0

我對vim + lxml組合(我自己都熟悉)很不熟悉,所以我很難在這裏描述交互。對不起,我不能有更多的幫助。 – JKesMc9tqIQe9M 2014-11-14 21:45:13

+0

交互不是問題:)這是我已經解決的一部分。但我的問題是將行轉換爲xpath。 – m42e 2014-11-15 19:01:56