我想检查一个节点是否存在于特定节点下,它可以存在于任何级别。(可以更深入)。
对于这个XML:
<main>
<sub>
<inner>
<first></first>
<second></second>
</inner>
</sub>
</main>
如何使用Nokogiri检查sub
节点是否有内部节点first
,而不直接使用XPath '/sub/inner'
?
除非知道sub
节点位于顶层,否则XPath是不正确的。可以将XPath选择器看作是操作系统中的路径。/sub
将位于驱动器的根目录。
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"