記事
Mihoko Iijima · 2021年2月12日 5m read

XMLファイルの内容をデータベースに登録する方法

これは InterSystems FAQ サイトの記事です。

XMLファイルの内容を格納する永続クラス定義を作成し、%XML.Adaptor を追加で継承します。

例は以下の通りです(右端の %XML.Adaptorクラスを追加で継承します)。

Class ISJ.Class1 Extends (%Persistent, %Populate, %XML.Adaptor)

 

次に、%XML.Reader クラスを使用して格納先のインスタンスへ、タグとクラスの関連付け(Correlate())を行い、reader.Next() でXMLを取り込みます。

set sc=reader.OpenFile(filename)
do reader.Correlate(tag,class)
while reader.Next(.x,.sc) { do x.%Save() } 

 

サンプルコードは以下の通りです。

Class ISJ.Class1 Extends (%Persistent, %Populate, %XML.Adaptor)
{
Property a As %String;

Property b As %String;

/// 引数:入力するXMLファイルのフルパス
ClassMethod Import(filename As %String)
{
    if $get(filename)="" {
        write "入力ファイルを引数に指定してください",!
        quit
    }
    // クラス名指定(..%ClassName()でクラスメソッドの存在するクラス名を返します)
    set class=..%ClassName(1)
    
    // XMLタグ指定
    set tag="test"
    set reader = ##class(%XML.Reader).%New()
    set sc=reader.OpenFile(filename)  
    If $$$ISERR(sc) {
        write $system.Status.GetErrorText(sc),!
        Quit
    }   
    // クラスとの関連付け
    do reader.Correlate(tag,class)
    while reader.Next(.x,.sc) {
        set sc=x.%Save()
        If $$$ISERR(sc) {
            write $system.Status.GetErrorText(sc),!
            Quit
        }
    }
    quit
}
}

 

入力するXMLファイル例は以下の通りです。

<?xml version="1.0" encoding="UTF-8"?>
<top><test>
  <a>あいうえお</a>
  <b>かきくけこ</b>
</test>
<test>
  <a>O8634</a>
  <b>H7321</b>
</test>
<test>
  <a>J5426</a>
  <b>V2218</b>
</test>
<test>
  <a>J7155</a>
  <b>M6804</b>
</test>
<test>
  <a>R7066</a>
  <b>W939</b>
</test>
<test>
  <a>B9731</a>
  <b>I406</b>
</test>
<test>
  <a>I1095</a>
  <b>Z5125</b>
</test>
<test>
  <a>Q1573</a>
  <b>Z9241</b>
</test>
<test>
  <a>T7560</a>
  <b>V5693</b>
</test>
<test>
  <a>J1033</a>
  <b>J9616</b>
</test>
</top>

 

実行例は以下の通りです。

(1) ターミナルを開き(またはIRISへログインし)クラス定義を作成したネームスペースへ移動します。

ネームスペースの変更方法は以下の通りです。

set $namespace="USER"

 

※ Linux/Unix上の IRIS へログインする方法は、 iris session <構成名> を実行します。例は以下の通りです。

iris session IRIS

 

(2) 入力例のXMLをファイルに保存(UTF-8で保存)し、ファイルのフルパスを変数に設定します。

例)/ISC/data.xml に配置した例

set file="/ISC/data.xml"

 

(3) 例のクラス定義(ISJ.Class1)の Import() メソッドを実行します。引数に (2) で設定した変数 file を指定しています。

do ##class(ISJ.Class1).Import(file)

 

(4) データを確認します。

管理ポータルで確認する場合は以下の手順で画面を開きます。

管理ポータル > システムエクスプローラ > SQL > クラス定義のあるネームスペースに移動
> スキーマのプルダウンから ISJ を選択 > テーブル の >  をクリックし展開 > Class1を選択して、画面右側の「テーブルを開く」をクリック

または、画面右側の「クエリ実行」タブをクリックし、テーブル名をドラッグしクエリ実行タブのテキストエリアでドロップし、実行ボタン押下

 

ターミナルで確認する場合は、SQL 実行環境に変更します。

do $system.SQL.Shell()

 

プロンプトが >> に変更されたらSELECE文を記述してEnterを押下します

USER>do $system.SQL.Shell()
SQL Command Line Shell
----------------------------------------------------

The command prefix is currently set to: <<nothing>>.
Enter <command>, 'q' to quit, '?' for help.
[SQL]USER>>select * from ISJ.Class1
1.      select * from ISJ.Class1

ID      a       b
1       あいうえお      かきくけこ
2       O8634   H7321
3       J5426   V2218
4       J7155   M6804
5       R7066   W939
6       B9731   I406
7       I1095   Z5125
8       Q1573   Z9241
9       T7560   V5693
10      J1033   J9616

10 Rows(s) Affected
statement prepare time(s)/globals/cmds/disk: 0.0822s/37396/167775/3ms
          execute time(s)/globals/cmds/disk: 0.0007s/11/1370/0ms
                          cached query class: %sqlcq.USER.cls29
---------------------------------------------------------------------------
[SQL]USER>>quit

USER>
10
1 0 0 31
Log in or sign up to continue