金子邦彦研究室プログラミングRuby プログラミングRuby で XML ドキュメントを解析する

Ruby で XML ドキュメントを解析する

Ruby を使って,XML ドキュメントの解析を行うプログラム例を示す.

この Web ページの例は Ruby 1.9 系列では動かない

プログラム例

XML ドキュメントから XPath のパス式を使ってテキストを得る


#! 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 での実行結果の例

[image]

Linux での実行結果の例

[image]