2010-08-16 7 views
1

저는 주어진 XHTML 문자열의 다차원 해시를 얻을 수있는 라이브러리를 둘러 보았습니다.Ruby에서 XHTML에서 다차원 해시로

XHTML :

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

예상 해시 :

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

답변

1

당신의 예를 정말 반환해야하는지의 잘 정의 된 정의를 제공하지 않습니다. 텍스트 노드가 무시됩니까? 요소에 자식 요소가 여러 개있는 경우 어떻게됩니까? 외부 <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

관련 문제