2009-05-23 59 views
0

正如我所瞭解的XPath,它是一種瀏覽XML文檔中元素的方法。
方向是XPath - >元素。
你如何去相反?也就是說,從已知的元素值計算XPath?有沒有一種方法可以根據網頁中已知的值計算XPath?

例如,如何找到stackoverflow頭中「faq」鏈接的xpath?
語言並不那麼重要,我對能夠幫助我計算XPath的算法和/或庫/技術更感興趣。

回答

2

這裏有一個簡單的JS函數來完成它需要什麼。它只使用previousSibling,nodeType和parentNode,所以它應該可以移植到其他語言。然而,結果是不可讀的(對於人類而言),並且在頁面改變時它不會特別可靠。

根據我的經驗,如果手寫,XPath會更有用。但是,您當然可以製作一個算法,以生成更漂亮(如果可能更慢)的結果。

function getXPath(node) 
{ 
    if(node == document) 
    return "/"; 
    var xpath = ""; 
    while (node != null && node.nodeType != Node.DOCUMENT_NODE) 
    { 
    print(node.nodeType); 
    var pos = 1, prev; 
    while ((prev = node.previousSibling) != null) 
    { 
     node = prev 
     pos++; 
    } 
    xpath = "/node()[" + pos + "]" + xpath; 
    node = node.parentNode; 
    } 
    return xpath; 
} 
1

因爲XPath可以選擇第n個子元素(即/ parentelement/child_element [2]),所以如果你可以找出樹中元素的位置,那麼你應該能夠生成一個XPath回來。

1

您沒有指定使該問題難以回答的語言。蟒蛇LXML模塊可以做到這一點

>>> a = etree.Element("a") 
>>> b = etree.SubElement(a, "b") 
>>> c = etree.SubElement(a, "c") 
>>> d1 = etree.SubElement(c, "d") 
>>> d2 = etree.SubElement(c, "d") 

>>> tree = etree.ElementTree(c) 
>>> print(tree.getpath(d2)) 
/c/d[2] 
>>> tree.xpath(tree.getpath(d2)) == [d2] 
True 

即使你不使用python你會發現你在模塊的源代碼

相關問題