如何检查 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"
我想检查某个节点是否存在于特定节点下,它可以存在于任何级别。 (可以更深)
为此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"