如何使用 XPath 选择任意深度的子元素?
Posted
技术标签:
【中文标题】如何使用 XPath 选择任意深度的子元素?【英文标题】:How do I select child elements of any depth using XPath? 【发布时间】:2013-04-07 15:31:05 【问题描述】:假设我有这个(简化):
<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>
我知道我可以选择孙子元素,但我不能选择任何深度的grand-grand-grand-...-childeren。例如:
//form[@id='myform']/*/input[@type='submit']
只选孙子,不深。
//form[@id='myform']/*/*/input[@type='submit']
只选择孙子,没有进一步或更少的深度。
//form[@id='myform']/**/input[@type='submit']
无效。
那么,如何在不使用元素 ID 的情况下可靠地选择此提交按钮?
【问题讨论】:
【参考方案1】:你快到了。只需使用:
//form[@id='myform']//input[@type='submit']
//
快捷方式也可以在表达式中使用。
【讨论】:
C# 似乎不理解这种表示法。//form//input
在 C# 中返回 null 而 Chrome 可以使用相同的 xpath 找到 35 个输入
我的最后一条评论在这里讨论:***.com/questions/23232671/…
查看此站点以获取更多 XPath 命令 - scientecheasy.com/2019/08/xpath-axes.html【参考方案2】:
//form/descendant::input[@type='submit']
【讨论】:
添加一些描述。【参考方案3】:如果您使用的是 XmlDocument 和 XmlNode。
说:
XmlNode f = root.SelectSingleNode("//form[@id='myform']");
用途:
XmlNode s = f.SelectSingleNode(".//input[@type='submit']");
这取决于您使用的工具。但是 .// 将从参考节点中选择任何子节点,任何深度。
【讨论】:
在之前提取的某个 XML 节点上使用 SelectSingleNode 命令在 Powershell 中运行良好。【参考方案4】:另外,您可以使用 css 选择器来做到这一点:
form#myform input[type='submit']
css 选举器中元素之间的空间意味着搜索 input[type='submit'] 父表单任何深度的元素#myform 元素
【讨论】:
以上是关于如何使用 XPath 选择任意深度的子元素?的主要内容,如果未能解决你的问题,请参考以下文章