2017-05-16 17 views
0

は次のようにXML構造が与えられている場合:鋸山チェックXML要素は、子ノード

ルビーを使用して
<homes> 
    <home> 
     <name>home 1</name> 
    </home> 
    <home> 
     <name>home 2</name> 
    </home> 
</homes> 
<flats> 
    <flat>Flat 1</flat> 
</flats> 

を、私は、ノードを反復処理し、子要素が別の要素またはテキストノードであるかどうかを確認する方法を鋸山?

基本的に子ノードが別の要素である場合、私はそれが単なるテキストノードであった場合よりも出力を使って行うことを変更する必要があります。

キー名を知らずにこれを行う必要があります。

例として、(私はこれが子要素を持っていることを知っているように)キー名をチェックすれば、私はちょうど私が望むことができますが、これは一般的でデータ固有ではない必要があります。私は、キーの名前を知らないかもしれない実際のデータと同様にif element.name === 'home':これを使用しないようにしようと

repeatingElements = [] 
     nodes.each do |element| 
      case element 
      when Nokogiri::XML::Element 
      child_content = map_content(element.children, {}) 
      if element.name === 'home' 
       repeatingElements << { 
       element.name => child_content 
       } 
       content_hash = repeatingElements 
      else 
       content_hash[element.name] = child_content unless child_content.empty? 
      end 
      when Nokogiri::XML::Text 
      return element.content 
      end 
     end 
     content_hash 
     end 

イム:

これは私がキー名をチェックして持っているものです。

答えて

0

あなたのサンプルのXMLドキュメントに基づいて、より簡単な方法を試すことはできません。この擬似コードは機能する必要があります。 'Nokogiri :: XML :: ELEMENT'には 'next_element'というメソッドがあります。次のように

xml_doc.elements.each do |ele| #iterate over children in the doc" ele.children.each do |child_ele| #check if the next element belongs to nokogiri text class unless child_ele.next_element.class == 'Nokogiri::XML::Text' #do something with child_elements which are not text else #do something with text element end end end

関連する問題