如何检查 Ruby 中的 XML 中是否存在特定节点

How to check if a particular node is present in XML in Ruby

我想检查某个节点是否存在于特定节点下,它可以存在于任何级别。 (可以更深)

为此XML:

<main>
  <sub>
    <inner>
      <first></first>
      <second></second>
    </inner>
  </sub>
</main>

如何在不直接使用 XPath '/sub/inner' 的情况下使用 Nokogiri 检查 sub 节点是否有内部节点 first

除非您知道 sub 节点位于顶层,否则您的 XPath 不正确。将 XPath 选择器视为 OS 中的路径。 /sub 将位于驱动器的根目录。

为了清晰起见,我建议使用 CSS 选择器:

require 'nokogiri'

doc = Nokogiri::HTML(<<EOT)
<main>
  <sub>
    <inner>
      <first>first_text</first>
      <second></second>
    </inner>
  </sub>
</main>
EOT

doc.at('sub first').text # => "first_text"

'sub first' 意味着 first 必须存在于 'sub' 之下的某处。

这可能有帮助:

require 'nokogiri'

doc = Nokogiri::HTML(<<EOT)
<main>
  <sub>
    <inner>
      <first>first_text</first>
      <second></second>
    </inner>
  </sub>
</main>
EOT

doc.at('/sub/first') # => nil
doc.at('sub first') # => #<Nokogiri::XML::Element:0x3fd580c9e54c name="first" children=[#<Nokogiri::XML::Text:0x3fd580c9e2f4 "first_text">]>
doc.at('//sub/*/first') # => #<Nokogiri::XML::Element:0x3fd580c9e54c name="first" children=[#<Nokogiri::XML::Text:0x3fd580c9e2f4 "first_text">]>
doc.at('//sub//first') # => #<Nokogiri::XML::Element:0x3fd580c9e54c name="first" children=[#<Nokogiri::XML::Text:0x3fd580c9e2f4 "first_text">]>

doc.at('sub first').text # => "first_text"
doc.at('//sub/*/first').text # => "first_text"
doc.at('//sub//first').text # => "first_text"