RubyでXMLファイルを作成したい

こんにちは!kossyです!



さて、今回はRubyの標準モジュールである rexml/document を使って、XMLファイルを作成する方法について、
ブログに残してみたいと思います。



XMlとは

Extensible Markup Language(エクステンシブル マークアップ ランゲージ)は、
基本的な構文規則を共通とすることで、任意の用途向けの言語に拡張することを容易としたことが特徴のマークアップ言語の総称である。
一般的にXML(エックスエムエル)と略称で呼ばれる。JISによる訳語は「拡張可能なマーク付け言語」と定義している。

XMLの最も重要な目的は、異なる情報システムの間で、特にインターネットを介して、
構造化された文書や構造化されたデータの共有を、容易にすることである。
XMLを使うと、文書を構造化して記述できるし、コンピュータのデータを直列化 (シリアライズ) できる。

XMLは、ユーザが定義したタグを用いて文章構造を記述するマークアップ言語である。
HTMLが、Webページを記述するための言語であるのに対して、XMLは、データ交換のための汎用のデータ形式である。
HTMLで使用するタグはあらかじめ定義済みのものだが、XMLではユーザが新しくタグを定義して、データの意味や構造を記述することが可能である。

出典: https://ja.wikipedia.org/wiki/Extensible_Markup_Language

要はインターネット上で構造かされたデータをやりとりしたいときに用いるもの、という理解で問題なさそうです。

Ruby気象庁防災XMLファイルを作成してみる

以下のサイトにあったXMLのサンプルファイルをRubyで作ってみたいと思います。

基本的には、

① REXML::Document.newで雛形オブジェクトを作成

② REXML::XMLDecl.newで宣言要素を追加

③ add_elementやadd_textを駆使してXMLタグやテキストを記述していく

の流れになります。

より複雑なことをしたい場合は、

を参考にしてみてください。

以下、コードを全晒しします。

require 'rexml/document'

class CreateXml

  def initialize
    # 雛形オブジェクトの作成
    @doc = REXML::Document.new

    # 宣言要素の記述
    @doc << REXML::XMLDecl.new('1.1', 'UTF-8')

    # 要素の追加
    # add_element 要素名, 要素の属性
    # xmlns属性は名前空間を宣言するための属性
    # https://www.mitsue.co.jp/glossary/html4_xhtml1/attribute/xmlns.html
    @report_el = @doc.add_element 'Report', {
      'xmlns' => 'http://xml.kishou.go.jp/jmaxml1/',
      'xmlns:jmx' => 'http://xml.kishou.go.jp/jmaxml1/'
    }
  end

  def create_xml
    insert_control_part
    insert_head_part

    File.open(Rails.root + 'output.xml', 'w') do |file|
      # ファイル書き出し
      # インデントは2を指定
      @doc.write(file, indent=2)
    end
  end

  private

  def insert_control_part
    control_el = @report_el.add_element 'Control'

    title_el = control_el.add_element 'Title'

    # テキストの挿入
    title_el.add_text '季節観測'

    date_time_el = control_el.add_element 'DateTime'
    date_time_el.add_text '2009-01-09T02:02:05Z'

    status_el = control_el.add_element 'Status'
    status_el.add_text '通常'

    editor_office_el = control_el.add_element 'EditorialOffice'
    editor_office_el.add_text '熊谷地方気象台'

    publish_office_el = control_el.add_element 'PublishingOffice'
    publish_office_el.add_text '熊谷地方気象台'
  end

  def insert_head_part
    head_el = @report_el.add_element 'Head', {
      'xmlns' => 'http://xml.kishou.go.jp/jmaxml1/informationBasis1/'
    }

    title_el = head_el.add_element 'Title'
    title_el.add_text '季節観測'

    report_date_time_el = head_el.add_element 'ReportDateTime'
    report_date_time_el.add_text '2009-01-09T11:00:00+09:00'

    target_date_time = head_el.add_element 'TargetDateTime'
    target_date_time.add_text '2009-01-09T00:00:00+09:00'

    event_id_el = head_el.add_element 'EventID'
    event_id_el.add_text '20090109110000_初雪'

    info_type_id = head_el.add_element 'InfoType'
    info_type_id.add_text '発表'

    head_el.add_element 'Serial'

    info_kind_id = head_el.add_element 'InfoKind'
    info_type_id.add_text '特殊気象報'

    info_kind_version_el = head_el.add_element 'InfoKindVersion'
    info_kind_version_el.add_text '1.0_0'

    head_line_el = head_el.add_element 'Headline'
    head_el.add_element 'Text'
  end
end


生成されるXMLファイルはこんな感じ。
f:id:kossy-web-engineer:20200922020243p:plain



勉強になりました。



参考にさせていただいたサイト
class REXML::Document (Ruby 2.7.0 リファレンスマニュアル)
REXML で XML ファイルを作成する | まくまくRubyノート
気象庁防災情報XMLフォーマット | 技術資料
xmlns属性 | 用語集 | ミツエーリンクス
Extensible Markup Language - Wikipedia