2013-04-15 45 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']"); 

这取决于您使用的工具。但。将选择任何儿童,从参考节点的任何深度。