hakeの日記

Windows環境でプログラミングの勉強をしています。

XMLの解析

Rubyの勉強
昨日のスクリプトだと何故かPodcast系のRSSが上手くいかないので、REXMLを使用してxmlを直接解析。xml

 <foo …>……</foo>

を一つのelementとして扱うみたい、基本的にはあるelementが子elementを持っているか確認してeach_elementで階層を降りていくように解析していく?

参考サイト:


以下は、そのelementの各要素を扱うサンプルスクリプト

require 'rexml/document'

# サンプルxml
#<root>
#  <pre_c1:child1>text_child1</pre_c1:child1>
#  <child2 key1='val1' key2='val2' />
#</root>
src = %q{<root><pre_c1:child1>text_child1</pre_c1:child1><child2 key1="val1" key2="val2" /></root>}
doc = REXML::Document.new(src)

p doc.root               # => <root> ... </>
p doc.root.has_elements? # => true

# 各child elementを処理する場合
doc.root.each_element do |element|
  p element
end
  # => <pre_c1:child1> ... </>
  # => <child2 key1='val1' key2='val2'/>

# elementを直接指定する場合
elem = doc.root.elements["pre_c1:child1"]
p elem.prefix                # => "pre_c1"
p elem.name                  # => "child1"
p elem.expanded_name         # => "pre_c1:child1"
p elem.fully_expanded_name   # => "pre_c1:child1"
p elem.has_text?             # => true
p elem.text                  # => "text_child1"

elem = doc.root.elements["child2"]
p elem.prefix                # => ""
p elem.has_attributes?       # => true
p elem.attributes # => {"key1"=>key1='val1', "key2"=>key2='val2'}
p elem.attributes["key1"]    # => "val1"