[참고:Rails for Java Developers]
xml 파싱 중, 푸시파싱과 풀파싱.  둘다 순서대로 한방향으로 이동하며 처리되는 로직이다.
트리파싱은 전체 문서를 불러들이고 무작위로 접근. 복잡한 문서활용때 효과증가.

푸시파싱//
require 'rexml/parsers/sax2parser'
include REXML::Parsers

 targets = []
 xml ='<data><type name="a">test1</type>
             <type name="b">test2</type>
          <type name="c">test3</type></data>'
 parser = SAX2Parser.new(xml)
 parser.listen(:start_element, %w{type}) do |u,l,q,atts|  
    targets << {:name=>atts['name']}
 end
 parser.parse
 
 puts targets
=>namea
   nameb
   namec

##여기서 %w{}는 배열 생성자

풀파싱//
require 'rexml/parsers/pullparser'
include REXML::Parsers
 targets = []
 xml ='<data><type name="a">test1</type>
             <type name="b">test2</type>
          <type name="c">test3</type></data>'
 parser = PullParser.new(xml)
  parser.each do |e|
   if e.start_element? and e[0] == 'type'
     targets << {:name=>e[1]['name']}
   end
  end
 
 puts targets
=>namea
   nameb
   namec

트리파싱//
require 'rexml/document'
include REXML

targets = []
 xml ='<data><type name="a">test1</type>
             <type name="b">test2</type>
          <type name="c">test3</type></data>'
  Document.new(xml).elements.each("//type") do |e|
    targets << {:name=>e.attributes["name"]}
  end
 
 puts targets
=>namea
   nameb
   namec


빌더로 xml 생성
require 'rubygems'
require 'builder'

xml = Builder::XmlMarkup.new :type=>STDOUT, :indent=>1
xml.data do
  xml.type "test1", :name=>"a"
  xml.type "test2", :name=>"b"
  xml.type "test3", :name=>"c"
end

puts xml.to_ary
=><data>
    <type name="a">test1</type>
     <type name="b">test2</type>
     <type name="c">test3</type>
   </data>
   <to_ary/>

##레일스에 기본적으로 내장되어있는 줄 알고 있었는데, 새로 설치해야 했다. 그럴 경우 gem install builder로 설치
rails 1.x 버전은 require_gem, 2.x 버전은 그냥 require로...

[기타정보]
rexml 공식 // http://www.germane-software.com/software/rexml/
rexml api reference // http://docs.huihoo.com/rdoc/ruby/stdlib/libdoc/rexml/rdoc/index.html
builder reference // http://builder.rubyforge.org/

Posted by Ssirius

카테고리

전체 (92)
Programming (13)
Digital Nomad (2)
Projects (7)
Sound (14)
Travel (45)
Think (9)

달력

«   2018/06   »
          1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30

티스토리 툴바