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



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

对于这个XML:

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

如何使用Nokogiri检查sub节点是否有内部节点first,而不直接使用XPath '/sub/inner' ?

除非知道sub节点位于顶层,否则XPath是不正确的。可以将XPath选择器看作是操作系统中的路径。/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"

相关内容

  • 没有找到相关文章

最新更新