Ruby で XML ドキュメントを解析する
Ruby を使って,XML ドキュメントの解析を行うプログラム例を示す.
この Web ページの例は Ruby 1.9 系列では動かない
プログラム例
XML ドキュメントから XPath のパス式を使ってテキストを得る
- REXML を使う
- XML ドキュメントのファイルを読み込む.ファイル名は定数 FILENAME に設定
- 属性を得たいときはelem.textの部分をelem.attributesに変える
- REXML は UTF-8 で動くので,XML ドキュメントとパス式は UTF-8 に変換する
- 結果は UTF-8 で得られる.Windows31J に変換してコンソールに表示
#! ruby -Ks
# coding: windows-31j
require 'pp'
require 'nkf'
require 'rexml/document'
def windows31j_to_utf8(s)
# Windows-31J から UTF-8 (Byte Order Mark; BOM 無し) へ変換
# nkf については http://www.ruby-lang.org/ja/man/html/nkf.html
if ( RUBY_VERSION < "1.9" )
return NKF::nkf( '-Swm0', s )
else
# Ruby 1.9 では入力が "Windows-31J" かどうかは気にしない(自動判別機能を信じることにする)
return s.encode("UTF-8")
end
end
def utf8_to_windows31j(s)
# UTF-8 から Windows-31J へ変換
# nkf については http://www.ruby-lang.org/ja/man/html/nkf.html
if ( RUBY_VERSION < "1.9" )
return NKF::nkf( '-Wsm0', s )
else
# Ruby 1.9 では入力が "UTF-8" かどうかは気にしない(自動判別機能を信じることにする)
return s.encode("Windows-31J")
end
end
def read_file_and_utf8(fname)
# ファイルを読み UTF-8 に変換の上、変数 utf8 に格納し、帰り値として返す
utf8 = ""
File.open(fname, "r") do |f|
utf8 << NKF::nkf( "-wm0", f.read )
end
return utf8
end
def get_text(doc, path)
# UTF-8 形式の XML 文書 (doc) とパス式 (path) からテキストの配列を得る.
# パス式にマッチするものが無い場合には,要素0個の配列が得られる
t = Array.new
# パス式 (path) は UTF-8 でないかも知れないので、UTF-8 に変換
elements = doc.elements.each(windows31j_to_utf8(path)) do |elem|
# 結果は Windows31J に変換
t << utf8_to_windows31j( elem.text )
end
return t
end
if __FILE__ == $0
# MIME encode と MIME decode の例
# Windows の場合の書き方. 「C:」のようにドライブ名を付ける
FILENAME="C:/hoge.xml"
# Linux の場合の書き方
# FILENAME="/tmp/hoge.xml"
# 念のためカレントディレクトリを変更しておく
Dir.chdir( File.dirname( File.expand_path( FILENAME ) ) )
utf8 = read_file_and_utf8 FILENAME
doc = REXML::Document.new(utf8)
pp get_text(doc, "/ALL/TITLE")
pp get_text(doc, "/ALL/著者")
pp get_text(doc, "/ALL/‖〜−¢£¬|")
pp get_text(doc, "/ALL/なし")
end
* XML ドキュメントの例
<?xml version="1.0"?> <ALL> <TITLE> ほげ </TITLE> <著者> ほげほげ </著者> <著者> ほげほげ2 </著者> </ALL>
* 実行結果の例
Windows での実行結果の例

Linux での実行結果の例
