如何使用 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>

我知道我可以选择孙子辈的元素,但是我不能选择任何深度的孙子辈。例如:

  • //form[@id='myform']/*/input[@type='submit']只选择孙子,没有进一步的深度。
  • //form[@id='myform']/*/*/input[@type='submit']只选择孙子孙女,没有进一步或更少的深度。
  • //form[@id='myform']/**/input[@type='submit']无效。

那么,如何在不使用元素 ID 的情况下可靠地选择这个提交按钮呢?

193045 次浏览

你就快成功了,简单使用:

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

//快捷方式也可以在表达式内部使用。

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

如果使用的是 XmlDocument 和 XmlNode。

说:

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

用途:

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

它取决于您使用的工具。但是.//将从引用节点选择任何子节点、任何深度。

同样,你也可以使用 css 选择器:

form#myform input[type='submit']

Css 选择器中元素之间的空格意味着在父表单 # myform 元素的任意深度搜索 input [ type = ‘ subit’]