2009-05-23 9 views
0

私はXPathを理解しているので、XML文書の要素をナビゲートする方法です。
方向はXPath - >要素です。
どうやって逆に進むのですか?つまり、既知の要素値からXPathを計算しますか?Webページの既知の値から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

この質問に答えるのが難しい言語を指定していません。 Pythonのlxmlのモジュールは、あなたのpythonを使用していない場合でも、それを

>>> 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 

を行うことができ、あなたが

関連する問題