Ваш пример не дает действительно хорошо определенное определение того, что должно быть возвращено. Не игнорируются ли текстовые узлы? Что произойдет, если элемент имеет несколько дочерних элементов <div>
? Что произойдет, если внешний элемент <div>
имеет атрибут с именем children
?
В дополнение к этому вы, вероятно, не должны строить такую структуру, если у вас есть способ использовать встроенную структуру данных библиотеки разбора XML/HTML по вашему выбору и использовать запросы XPath для получения требуемые узлы данных.
Не считая всего вышеперечисленного, это простое начало, которое может приблизиться к тому, что вы имеете в виду.
require "nokogiri"
class Nokogiri::XML::Node
def to_hash
# Build hash of attributes. Attribute values are split into arrays.
contents = Hash[attributes.collect { |name, value|
[name.to_sym, value.to_s.split(/\s+/)] }]
# Add array of child hashes recursively.
if element_children.any?
contents[:children] = element_children.collect { |child| child.to_hash }
end
# Return new hash with the element name as single key.
{ name.to_sym => contents }
end
end
Использование следующим образом:
doc = Nokogiri::XML('<div class="class-1 class-2" id="my-id">
<div class="classy">
</div>
</div>')
doc.root.to_hash
#=> { :div =>
# { :class => ["class-1", "class-2"],
# :children =>
# [ { :div =>
# { :class => ["classy"] }
# } ],
# :id => ["my-id"]
# }
# }
Спасибо за указание мне в правильном направлении: вот результат: http://github.com/kuroir/Nokogiri-to-Hash – MarioRicalde