В Nokogiri, как мне найти все узлы, которые появляются до определенного node в моем документе?
Использование Rails 5, Ruby 2.4. Если я нашел node, используя синтаксический анализ Nokogiri, как бы найти все узлы, которые произошли до моего найденного node, который также не включает найденный node? То есть, скажем, мой документ
<outer>
<p>Hello</p>
<inner>
<most_inner class="abc">Howdy</most_inner>
<most_inner class="def">Next</most_inner>
</inner>
</outer>
и я запускаю запрос типа
node = doc.search('//*[contains(@class, "def")]').first
Как бы я нашел все предыдущие узлы (которые не включают тот, который я только что идентифицировал)? Узлы, которые я ожидал бы, были бы
<p>Hello</p>
<most_inner>Howdy</most_inner>
Ответы
Ответ 1
Вам просто нужно перебирать узлы листа, пока не достигнете цели node.
# Node to exclude
node = doc.search('//*[contains(@class, "def")]').first
preceding_nodes = []
# Find all leaf nodes
leaf_nodes = doc.xpath("//*[not(child::*)]")
leaf_nodes.each do |leaf|
if leaf == node
break
else
preceding_nodes.push(leaf)
end
end
preceding_nodes # => Contains all preceding leaf nodes