2013-04-15 70 views
55

假設我有這個(簡體):如何使用XPath選擇任何深度的子元素?

<form id="myform"> 
    <!-- some input fields --> 
    <input type="submit" value="proceed"/> 
</form> 

然後,我可以選擇與XPath //form[@id='myform']/input[@type='submit']提交按鈕。大。

但是,我的模板可能會更改,我希望在提交按鈕所在的深度方面保持靈活性。它可能被放在一個表,像這樣:

<form id="myform"> 
    <!-- some input fields --> 
    <table><tr><td> 
      <input type="submit" value="proceed"/> 
    </td></tr></table> 
</form> 

我知道我可以選擇哪些是孫子的元素,但我不能選擇盛大,隆重盛大-...-任何深度的childeren。例如:

  • //form[@id='myform']/*/input[@type='submit']只選擇大孩子,沒有更深的深度。
  • //form[@id='myform']/*/*/input[@type='submit']只選擇盛大的孩子,沒有更多或更少的深度。
  • //form[@id='myform']/**/input[@type='submit']無效。

那麼,如何在不使用元素ID的情況下可靠地選擇此提交按鈕?

回答

89

你快到了。簡單使用:

//form[@id='myform']//input[@type='submit'] 

//快捷方式也可以在表達式中使用。

+0

C#似乎不理解這種表示法。 '// form input'在C#中返回null,而Chrome可以使用相同的xpath找到35個輸入 – Achilles

+1

我最近的評論在這裏討論:http://stackoverflow.com/questions/23232671/xpath-selects-in-htmlagilitypack- dont-work-as-expected – Achilles

5
//form/descendant::input[@type='submit'] 
+4

將一些描述添加進去。 – piyushj

+0

這在php中很有效 – hanshenrik

6

如果您使用的是XmlDocument和XmlNode。

說:

XmlNode f = root.SelectSingleNode("//form[@id='myform']"); 

用途:

XmlNode s = f.SelectSingleNode(".//input[@type='submit']"); 

這取決於您使用的工具。但。將選擇任何兒童,從參考節點的任何深度。