はちゅにっき

こっちのブログはまったり更新

XML を Parse したり書き出したりしたい

REXML を使って簡単にできました。
の前に。

no implicit conversion from nil to integer

とかいうエラーに悩まされたら

http://redmine.ruby-lang.org/repositories/diff/ruby-18/lib/rexml/formatters/pretty.rb?rev=19511

を見て、131行目付近を書き直してあげると幸せになれるかもしれません。
これでハマりました。

RubyXML操作 - Netsphere Laboratories
http://www.nslabs.jp/ruby-rexml.rhtml

REXMLについて
http://www.cozmixng.org/~kou/ruby/rexml/

を読めば、だいたいわかるよ!
なので、やっぱりここはメモ程度に。。。

REXML を使う

標準でついてくるみたい。
よって

require 'rexml/document'

で使えるみたい。

XML を Perse する

まずは対象の XML を読み込むところから

require 'rexml/document'

# source がすでに XML のフォーマットの場合
doc = REXML::Document.new( source )

# ファイルから読み込む場合
doc = REXML::Document.new( File.open('hoge.xml') )

仮に、この状態で以下の XML を Parse しようとした場合

<?xml version="1.0" encoding="UTF-8"?>
<content item_type="test">
  <title>hogefugapuga</title>
  <items>
    <item>
      <name>hoge1</name>
    </item>
    <item>
      <name>hoge2</name>
    </item>
 </items>
</content>

以下のようにかけば Parse することができました。

doc.elements['content'].attributes['item_type']
# => test

doc.elements['content/title'].text
# => hogefugapuga

doc.elements.each('content/items/item') do |item|
  item.elements['name'].text
  # => hoge1
  # => hoge2
end

基本的には、elements を用いて要素にアクセスし、text (get_text) を用いて値を取得したり、attributes を用いて、属性値(っていうの?)を取得すればいいみたい!
最初ちょっと悩んだけど、使ってみるとかんたんだね!

XML を出力してみる

また後ほど。。。