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>