【问题标题】:Use XPath to select root and children matching expression使用 XPath 选择根和子匹配表达式
【发布时间】:2016-07-24 13:12:30
【问题描述】:

我正在使用 Nokogiri 解析一些看起来像这样的 XML:

<item name="item one">
    <other name="other name"/>
    <third />
</item>
<item name="item two">
    <other />
    <third />
</item>

我正在使用 Nokogiri 解析项目,如下所示:

xmldoc.xpath("//item").each do |node|
  node.xpath("//*[@name]") # Gives me *all* elements in the doc
  node.xpath(".//*[@name]") # Gives me child elements of the item
end

当我迭代时,我可以使用什么表达式从第一个节点获取[item, other]

【问题讨论】:

  • 请阅读“minimal reproducible example”。您的 XML 无效并且您的源代码无法运行。不要要求我们编写代码只是为了测试您的代码。

标签: ruby xml xpath nokogiri


【解决方案1】:

开头的. 将使XPath 表达式特定于上下文,使用@ 获取属性,@* 获取所有属性(通配符):

node.xpath(".//*/@*")
node.xpath("@*")

并且,获取当前节点的所有属性以及所有子节点的所有属性:

node.xpath(".//@*")

【讨论】:

  • 是否有一个表达式可以同时完成两行?我想要根或任何孩子的所有属性。
  • 如何修改它以获取所有“名称”属性(忽略其他属性)?
  • @karl 试试./descendant-or-self::node()/@name.
  • .//@name 也可以。 ///descendant-or-self::node()/ 的简写。
【解决方案2】:

我不知道它是否适合你,但如果你找到节点 您可以使用node.name 获取item 元素,您可以找到所有other 并检查是否.parent.name== 'item' 在这里查看更多: https://github.com/sparklemotion/nokogiri/wiki/Cheat-sheet

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-10
    • 1970-01-01
    • 2018-01-05
    • 2021-11-08
    • 1970-01-01
    • 2016-06-02
    • 1970-01-01
    • 2023-04-04
    相关资源
    最近更新 更多