2015-07-24 5 views
0

Я хочу проверить, присутствует ли узел в определенном узле, он может присутствовать на любом уровне. (Это может быть глубже).Как проверить, присутствует ли конкретный узел в XML в Ruby

Для этого XML:

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

Как проверить, есть ли sub узел внутренний узел first или нет, используя Nokogiri без использования XPath '/sub/inner' напрямую?

+0

Как насчет XPath 'югу // first'? , который будет проверять/возвращать узел 'first' в' sub' независимо от того, насколько глубокий «первый» является вложенным – har07

ответ

2

Ваш XPath не подходит, если вы не знаете, что ваш узел sub находится на верхнем уровне. Подумайте о селекторах 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" 
Смежные вопросы