如何使用 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 选择任意深度的子元素?的主要内容,如果未能解决你的问题,请参考以下文章

XPATH 选择类型元素名称为 xs:simpleType 的子元素

XPath 根据子项的子值选择元素

xpath选择父节点类型不同的子节点

在 XDocument 中按名称查询任意深度的元素

XPath 获取除具有特定名称的子元素之外的所有子元素?

java-xpath学习