2010-08-16 2 views
1

Я искал библиотеки, которые позволят мне получить многомерный хэш данной строки XHTML.XHTML для многомерного хэша в Ruby

XHTML:

<div class="class-1 class-2" id="my-id"> 
    <div class="classy"> 
    </div> 
</div> 

Ожидаемый Hash:

hash = { 
:div => { 
    :class => ['class-1', 'class-2'], 
    :id => ['my-id'], 
    :children => { 
    :div => { 
     :class => ['classy'] 
    } 
    } 
} 
} 

ответ

1

Ваш пример не дает действительно хорошо определенное определение того, что должно быть возвращено. Не игнорируются ли текстовые узлы? Что произойдет, если элемент имеет несколько дочерних элементов <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"] 
#  } 
# } 
+0

Спасибо за указание мне в правильном направлении: вот результат: http://github.com/kuroir/Nokogiri-to-Hash – MarioRicalde