この章の内容は次のとおりです。
TransX Utilityを使用すると、XMLをデータベースに転送できます。より具体的には、TransX Utilityは翻訳済のシード・データおよびメッセージをデータベース・スキーマにロードするXML SQL Utility(XSU)のアプリケーションです。1つのデータベースに複数言語のデータを移入する場合、TransX Utilityを使用すると、通常はXSUを使用して開発する必要がある機能を利用できます。
TransX Utilityは、多言語XMLを処理する場合に特に有用です。このユーティリティは、次のことを行います。
変数の変更、開始順序、および複数の挿入操作またはセッションを必要とするその他のSQL文を自動的に管理します。したがって、翻訳ベンダーは、慣れていないSQLスクリプトまたはPL/SQLスクリプトを操作する必要がありません。
キャラクタ・エンコーディングを自動化します。したがって、データ・ファイルがXML標準に準拠しているかぎり、不適切なエンコーディングによるロード時のエラーは発生しません。
翻訳する文字列を準備し、翻訳し、データベースにロードすることで、グローバリゼーションのコストを削減します。
翻訳データ形式エラーを最小限に抑え、データベース内の事前に指定された場所に翻訳コンテンツを正確にロードします。データが事前定義済の形式であるとき、TransX Utilityはその形式を検証します。
様々なグローバリゼーション・サポートの設定による構文エラーが発生しません。
ピース単位のNCHARデータに対するUNISTRコンストラクタは不要です。
この項では、TransX Utilityが持つ次の機能について説明します。
多言語データまたはデータの翻訳をOracleデータベースに挿入またはエンコードする場合は、各XMLファイルを検証する必要があります。従来の翻訳データのロード方法では、ロードするファイルを切り替えるときにNLS_LANG環境変数の設定を変更していました。この変数は、クライアント・アプリケーションおよびデータベース・サーバーが使用する言語および地域を設定します。この変数によってクライアントのキャラクタ・セットも設定されます。これはクライアント・プログラムから入力または表示されるデータのキャラクタ・セットです。
従来の方法では、各ロード・ファイルは、それぞれの言語に適したキャラクタ・セットでエンコードされます。翻訳は、元のファイルと同じファイル形式—(通常SQLスクリプト)—で実行する必要があるため、この操作が必要でした。NLS_LANGの設定は、ファイルが言語に対応したキャラクタ・セットに適した形でロードされると同時に変更されます。この方法は、時間がかかるだけでなく、エンコーディング・メタデータがデータ自体と区別されるため、エラーが発生しやすくなります。
TransX Utilityでは、データセットと呼ばれる事前定義済の形式を持つXML文書を使用します。データセットにはエンコーディング情報およびデータが含まれ、NLS_LANGの設定を変更せずに多言語データを転送できます。TransX Utilityを使用すると、開発グループおよび翻訳グループは、データベースへのXMLデータのロード時に正しいキャラクタ・セットを維持する必要がなくなります。
|
関連項目: NLS_LANG環境変数の詳細は、『Oracle Databaseグローバリゼーション・サポート・ガイド』を参照してください。 |
TransX Utilityには、コマンドライン・インタフェースおよびプログラム可能なAPIがあります。このユーティリティは、データベースにロードされるシード・データを表す正規の方法として定義されたデータ形式に準拠します。この形式は、直感的で、翻訳グループ用に簡略化されています。フォーマット仕様は、データのロードを可能にするための、翻訳者によるデータの記述方法を定義します。データセットの値は、スカラー値で表現するか、定数、順序および問合せなどの式を使用して表現できます。
表12-1に、その他の有用なTransX Utility機能を示します。
表12-1 TransX Utilityの機能
| 機能 | TransX Utility |
|---|---|
|
コマンドライン・インタフェース |
簡単に使用できるコマンドを提供します。 |
|
ユーザーAPI |
Java APIが表示されます。 |
|
検証 |
データ形式を検証し、エラーを報告します。 |
|
空白の処理 |
特に指定されていないかぎり、データセットに含まれる空白文字は有効とみなされません。 |
|
アンロード |
入力された問合せに基づいて、結果を標準データ形式にエクスポートします。 |
|
翻訳交換フォーマットとの親和性 |
翻訳交換フォーマットとの間で変換を行うことができます。 |
|
ローカライズされたユーザー・インタフェース |
多数の言語でメッセージを表示します。 |
この項の内容は次のとおりです。
次のAPIを介してTransXにアクセスできます。
oracle.xml.transx.loaderクラス: このクラスには、TransXインスタンスを取得するためのgetLoader()があります。
oracle.xml.transx.TransXインタフェース: TransXのAPIです。
図12-1に、TransX APIを使用してXMLをOracleデータベースに転送するための基本的な処理の流れを示します。
TransXアプリケーションの基本プロセスは、次のとおりです。
TransXローダー・オブジェクトを作成します。次のようにgetLoader()をコールして、TransXクラスをインスタンス化します。
TransX transx = loader.getLoader();
TransX.open()を使用してデータベース接続情報を指定して、データ・ロード・セッションを開始します。セッションを作成するには、JDBC接続文字列、データベース・ユーザー名およびデータベース・パスワードを指定します。次のオプションがあります。
JDBC OCIドライバを使用して接続を作成します。この方法を示す次のコード部分は、指定されたユーザー名とパスワードを使用して接続します。
transx.open( "jdbc:oracle:oci8:@", user, passwd );
シンJDBCドライバを使用して接続を作成します。シン・ドライバはPure Javaで作成されており、すべてのJavaプログラムからコールできます。次のコード部分は、この方法を示して接続します。
transx.open( "jdbc:oracle:thin:@//myhost:1521/myservicename", user,passwd);
シン・ドライバにはホスト名(myhost)、ポート番号(1521)およびサービス名(myservicename)が必要です。データベースにはアクティブなTCP/IPリスナーが必要です。
|
注意: 検証はTransXによって実行されるため、データ形式の検証のみを行う場合はデータベース接続を確立する必要はありません。この場合は、先行するopen()コールなしでTransX.validate()メソッドを起動できます。 |
TransXローダーを構成します。表12-2に、構成メソッドを示します。
表12-2 TransXの構成メソッド
| メソッド | 説明 |
|---|---|
|
|
重複に対する操作モードを設定します。このモードは、データベース内の1つ以上の既存の行で、キー列の値がロードされるデータセットの値と同じであった場合のTransXの動作を決定します。 |
|
|
言語タグを大文字または小文字に設定します。デフォルトで、ローダーはDLFの |
|
|
空白の処理方法を指定します。デフォルトは |
|
|
検証モードを設定します。デフォルトは |
次の例は、ローダーが重複する行をスキップし、データセットを検証しないことを指定します。
transx.setLoadingMode( LoadingMode.SKIP_DUPLICATES ); transx.setValidationMode( false );
TransX.load()を起動してデータセットをロードします。ロード操作の反復中は同じJDBC接続を使用します。たとえば、次のように3つのデータセットをロードします。
String datasrc[] = {"data1.xml", "data2.xml", "data3.xml"};
...
for ( int i = 0 ; i < datasrc.length ; i++ )
{
transx.load( datasrc[i] );
}
TransX.close()を起動してロード・セッションをクローズします。このメソッドをコールすると、データベース接続がクローズします。
transx.close();
|
関連項目:
|
TransX Utilityのデモ・プログラムは、$ORACLE_HOME/xdk/demo/java/transxにあります。表12-3に、このユーティリティのテストに使用できるXMLファイルとプログラムを示します。
表12-3 TransX Utilityのサンプル・ファイル
| ファイル | 説明 |
|---|---|
|
|
TransXのデモの設定方法が記述されたテキスト・ファイル。 |
|
|
サンプル出力ファイル。次のコマンドは、emp表のすべてのデータを含む
transx -s "jdbc:oracle:thin:@//myhost:1521/myservicename" user
-pw emp.xml emp
|
|
|
デモのために作成された表および順序を削除するSQLファイル。 |
|
|
JDBC接続を作成し、データベースに3つのデータセットをロードするサンプルJavaアプリケーション。 |
|
|
デモ・アプリケーションで使用する2つの表および順序を作成するSQLスクリプト。 |
|
|
サンプル・データセット。 |
サンプル・プログラムのコンパイル方法および実行方法は、READMEに示されています。基本手順は次のとおりです。
ディレクトリを$ORACLE_HOME/xdk/demo/java/transxディレクトリ(UNIXの場合)または%ORACLE_HOME%\xdk\demo\java\transxディレクトリ(Windowsの場合)に変更します。
「Java XDK環境の設定」の説明に従って、環境変数が設定されていることを確認します。環境変数$ORACLE_SID(UNIXの場合)または%ORACLE_SID%(Windowsの場合)をデフォルト・データベースに設定することをお薦めします。
|
注意: セキュリティ上の理由から、コマンドライン・インタフェースにパスワードが表示されないようにしてください。TransXでパスワードのかわりに「-pw」と指定すると、[ パスワードの入力: ]と表示されてパスワードの入力を求められます。ユーザーがパスワードを入力してもパスワードがそのまま表示されることはなく、文字数分の「*」が表示されます。 |
txdemo1.sqlを実行して、サンプル・データベース・オブジェクトを設定します。データベースに接続し、次のようにtxdemo1.sqlスクリプトを実行します。
@txdemo1
コマンドラインからTransXユーティリティを実行します。たとえば、シンJavaドライバに接続する必要があり、ホストが myhost、ポートが1521、サービス名が myservicenameであるとします。トークンuserで示している場所にユーザー名を入力します。次のコマンドを実行して、データセットtxdemo1.xmlをロードできます。
transx "jdbc:oracle:thin:@//myhost:1521/myservicename" user -pw txdemo1.xml
操作が正常に実行された場合、端末への出力はありません。
データベースを問い合せて、ロードが正常に実行されたかどうかを確認します。次に例を示します。
SELECT * FROM i18n_messages;
デモ・オブジェクトを削除して、別のテストの準備をします。データベースに接続し、次のようにtxclean.sqlスクリプトを実行します。
@txclean
Javaのデモ・プログラムをコンパイルします。次に例を示します。
javac txdemo1.java
コマンドライン・インタフェースを起動したときに使用したのと同じJDBCおよびデータベース接続データを使用して、Javaプログラムを実行します。次に例を示します。
java txdemo1 "jdbc:oracle:thin:@//myhost:1521/myservicename" user -pw\
txdemo1.xml
前述と同じ問合せテスト(手順5)およびクリーンアップ操作(手順6)を実行します。
TransX Utilityを実行して、事前定義済のXML形式にデータをアンロードします。次に例を示します。
transx -s "jdbc:oracle:thin:@//myhost:1521/myservicename" user -pw emp.xml emp
emp.xmlのデータをemp-dlf.xmlと比較します。
|
注意: この機能を明確に示すため、この例では、デプロイ済システムで通常使用されるパスワード管理手法を実行していません。本番環境では、Oracle Databaseパスワード管理ガイドラインに従い、サンプル・アカウントをすべて無効にしてください。パスワード管理ガイドラインおよびその他のセキュリティ上の推奨事項については、『Oracle Databaseセキュリティ・ガイド』を参照してください。 |
TransX Utilityは、Oracle Databaseにパッケージ化されています。デフォルトでは、Oracle Universal Installerを使用してディスク上にユーティリティがインストールされます。「Java XDKコンポーネントの依存性」で説明しているように、TransXライブラリは$ORACLE_HOME/bin/xml.jar(UNIXの場合)および%ORACLE_HOME%\bin\xml.jar(Windowsの場合)です。
次の構文を使用して、オペレーティング・システムのコマンドラインからTransX Utilityを実行できます。
java oracle.xml.transx.loader
XDKには、$ORACLE_HOME/bin/transx(UNIXの場合)および%ORACLE_HOME%\bin\transx.bat(Windowsの場合)というTransXのスクリプト・バージョンが含まれます。PATH変数が正しく設定されている場合、次のようにTransXを実行できます。
transxoptionsparameterstransx.batoptionsparameters
たとえば、次のコマンドは有効な構文です。
transx -s "jdbc:oracle:thin:@//myhost:1521/myservicename" user -pw emp.xml emp
表12-4に、TransX Utilityのオプションを示します。
表12-4 TransX Utilityのコマンドライン・オプション
| オプション | 意味 | 説明 |
|---|---|---|
|
既存の行を更新します。 |
既存の行をスキップせず、更新します。更新操作の対象から列を除外するには、 |
|
行がデータベースにすでに存在する場合に例外を戻します。 |
重複行が検出されると例外を発生させます。デフォルトでは、TransXは重複行をスキップします。データベースおよびデータセットの検索キー列(複数可)の値が同じ場合は、行が重複しているとみなします。 |
|
データベースのデータを、事前定義済の形式で出力します。 |
|
|
|
データベースのデータを、事前定義済の形式でファイルに保存します。 |
アンロードを実行します。TransX Utilityはデータベースへの問合せを行って、その結果を事前定義済のXML形式にフォーマットし、指定したファイル名で格納します。 |
|
|
ロードするXMLを出力します。 |
挿入するデータセットを正規のXSU形式で出力します。 |
|
|
更新のためXMLを出力します。 |
更新するデータセットを正規のXSU形式で出力します。 |
|
|
検証を省略します(デフォルトでは、データセットは解析時に検証されます)。 |
TransX Utilityが形式の検証(デフォルトでは実行される)をスキップします。 |
|
|
データ形式を検証し、ロードせずに終了します。 |
TransX Utilityが検証を行って終了します。 |
|
|
すべての空白を保持します。 |
TransX Utilityが空白文字(\t、\r、\n、' 'など)を重要であるとみなします。文字列データ要素内の連続する空白文字は、デフォルトでは1つの空白文字とみなされます。 |
|
|
言語タグを大文字または小文字に設定します。 |
TransX UtilityはDLFの |
コマンドラインオプションの例外を次に示します。
-uと-eは、相互に排他的です。
-vは、次の例に示すとおり、後にデータを伴う唯一のオプションです。
-xは、次の例に示すとおり、後に接続情報およびSQL問合せを伴う唯一のオプションです。
すべての引数を省略すると、表12-4に示した使用方法の情報が表示されます。
表12-5に、TransX Utilityのコマンドライン・パラメータを示します。
表12-5 TransX Utilityコマンドライン・パラメータ
| パラメータ | 説明 |
|---|---|
connect_string |
JDBC接続文字列。『Oracle Database JDBC開発者ガイドおよびリファレンス』を参照してください。 |
username |
データベース・ユーザー名。 |
password |
データベース・ユーザーのパスワード、または「 |
datasource |
XML文書をファイル名またはURLで指定します。 |
options |
表12-4「TransX Utilityのコマンドライン・オプション」を参照してください。 |
|
関連項目: TransXインタフェースの詳細は、『Oracle Database XML Java APIリファレンス』を参照してください。 |
TransX Utilityは、データベースに多言語データを移入する場合に特に有用です。このユーティリティを使用して、データベース・スキーマとの間でデータを送受信するには、このスキーマにマップするデータセットを作成する必要があります。この項では、TransXを使用してデータベースの翻訳済アプリケーション・メッセージを整理する一般的な使用例を示します。
この項の内容は次のとおりです。
国際化されたシステムを構築するには、ローカライズ可能なリソースをビジネス・ロジックから切り離すことが不可欠です。このようなリソースの一般的な例として翻訳済のテキスト情報があります。データが特定の地域に固有のもので、共通の言語および文化的慣習を共有する場合は、ロケール固有の情報を取得できるリソース管理機能を使用してデータを編成する必要があります。多くの場合は、メンテナンスが簡単で柔軟性が高いため、データベースを使用してこのようなデータを格納します。
例12-1のような構造およびコンテンツを持つ表を作成し、データを挿入するとします。
例12-1 表translated_messagesの構造
CREATE TABLE translated_messages
(
MESSAGE_ID NUMBER(4)
CONSTRAINT tm_mess_id_nn NOT NULL
, LANGUAGE_ID VARCHAR2(42)
, MESSAGE VARCHAR2(200)
);
エンド・ユーザーの優先言語に基づいてアプリケーションでメッセージを取得できるように、この表では列language_idが定義されています。この列には、メッセージの言語を識別するための言語名の略称が含まれます。
例12-2に、表のサンプル・データを示します。
例12-2 translated_messagesの問合せ
MESSAGE_ID LANGUAGE_ID MESSAGE ---------- ----------- ---------------------------------- 1 us Welcome to System X 2 us Please enter username and password
|
関連項目: Oracleの言語の略称は、『Oracle Databaseグローバリゼーション・サポート・ガイド』を参照してください。 |
第13章「データ・ローディング・フォーマット(DLF)仕様」では、データ・ローディング・フォーマット(DLF)言語の構文について詳しく説明しています。この言語を使用して、TransXへの入力を提供するDLF文書を作成します。
正規の形式でデータセット(入力データ)を指定すると、そのデータは、TransX Utilityによってデータベース内の指定された場所にロードされます。TransXは、データベース・オブジェクトを作成しない点に注意してください。したがって、データをロードする前に、表またはビューを作成する必要があります。
例12-3に、例12-1で作成したtranslated_messages表を表すXML文書を示します。データセットは、この例ではtranslated_messagesというターゲット表の構造を反映しています。
例12-3 example.xml
<?xml version="1.0"?>
<table name="translated_messages">
<!-- Specify the unique identifier -->
<lookup-key>
<column name="message_id" />
<column name="language_id" />
</lookup-key>
<!-- Specify the columns into which data will be inserted -->
<columns>
<column name="message_id" type="number"/>
<column name="language_id" type="string" constant="us" translate="yes"/>
<column name="message" type="string" translate="yes"/>
</columns>
<!-- Specify the data to be inserted -->
<dataset>
<row>
<col name="message_id">1</col>
<col name="message" translation-note="dnt'X'">Welcome to System X</col>
</row>
<row>
<col name="message_id">2</col>
<col name="message">Please enter username and password</col>
</row>
<!-- ... -->
</dataset>
</table>
例12-3のXML文書は、次のような宣言で開始します。
<?xml version="1.0"?>
ルート要素の<table>は、表名を指定する属性を持ち、他のすべての要素を囲みます。
<table name="translated_messages"> ... </table>
「DLFの要素」で説明しているように、<table>要素には3つのサブセクションがあります。
前述のセクションは、次のように例12-3の要素にマップします。
<lookup-key>...</lookup-key> <columns>...</columns> <dataset>...</dataset>
検索キーは、行がすでにデータベースに存在する場合、行を評価するために使用する列です。メッセージと言語IDの対によって一意の文字列を識別する必要があるため、文書で対応する列をリストします。この場合、表translated_messagesのmessage_id、language_idおよびmessage列は、次のように<column>要素の属性にマップされます。
<column name="message_id" type="number"/> <column name="language_id" type="string" constant="us" translate="yes"/> <column name="message" type="string" translate="yes"/>
列セクションは、データセット・セクションのデータ・ピースと表列のマッピングを指定するため、表構造をミラー化する必要があります。列名は、XMLデータセットおよびデータベースの全体を通じて一貫している必要があります。表12-6の<column>属性を使用して、ロードするデータを記述できます。これらの属性は、「DLFの要素」で説明しているDLF属性のサブセットです。
表12-6 <column>の属性
| 属性 | 説明 | 例 |
|---|---|---|
|
type |
データセットの列のデータ型を指定します。この属性は、データセットの |
<column name="col" type="string" /> |
|
constant |
定数値を指定します。各行に固定値を持つ列では、同じ値を繰り返す必要はありません。 |
<column name="col" type="string" constant="us" /> |
|
language |
language属性は、列が言語タグを格納する言語列であることを示します。constant属性と同様に機能します。ただし、列を宣言するロールは言語列です。 |
<column name="language" type="string" language="us" /> |
|
sequence |
この列に値を入力するために使用されるデータベース内の順序を指定します。 |
<column name="id" type="number" sequence="id_sq" /> |
|
translate |
この列またはパラメータのテキストを翻訳するかどうかを指定します。 |
<column name="msg" type="string" translate="yes"/> |
<column>要素のconstant属性は、データセット・セクション内のすべての行の対応する列に格納する値を指定します。この例では元の言語を使用しているため、language_id列は値usに設定されています。
言語列の定義
別の方法として、language_id列で、constant属性でなくlanguage属性を使用することもできます。language属性を持つDLF文書では、XML名前空間でlang属性を使用できます。言語列では、プレースホルダ「%x」を使用して、ルート表要素の標準のxml:lang属性から値を取得できます。このためtranslate="yes"は不要です。値「%x」は変換する必要がありません。このDLFのロード結果は例10-3と同じです。
例12-4 language属性を持つexample.xml
<?xml version="1.0"?>
<table xml:lang="us" name="translated_messages">
<!-- Specify the unique identifier -->
<lookup-key>
<column name="message_id" />
<column name="language_id" />
</lookup-key>
<!-- Specify the columns into which data will be inserted -->
<columns>
<column name="message_id" type="number"/>
<column name="language_id" type="string" language="%x"/>
<column name="message" type="string" translate="yes"/>
</columns>
<!-- Specify the data to be inserted -->
<dataset>
<row>
<col name="message_id">1</col>
<col name="message" translation-note="dnt'X'">Welcome to System X</col>
</row>
<row>
<col name="message_id">2</col>
<col name="message">Please enter username and password</col>
</row>
<!-- ... -->
</dataset>
</table>
表13-10で説明しているように、type属性の有効な値はstring、number、dateおよびdateTimeです。これらの値はXMLスキーマ標準で定義されたデータ型に対応しているため、各データ・ピースはそれぞれのデータ型の定義に準拠する必要があります。表12-7に示すように、特にdateおよびdateTimeデータ型ではISO 8601形式を使用することが重要です。
表12-7 dateおよびdateTimeの形式
| データ型 | 形式 | 例 |
|---|---|---|
|
date |
CCYY-MM-DD |
2009-05-20 |
|
dateTime |
CCYY-MM-DDThh:mm:ss |
2009-05-20T16:01:37 |
例12-5に、TransXデータセットのdateTimeデータを持つ表の行の表現方法を示します。
「DLFの属性」で説明しているように、translation属性を使用して、翻訳済データが列に含まれるかどうかを指定できます。例12-3では、2つの<column>要素が異なった方法でtranslate属性を使用しています。language_id列の属性は、constant属性の値を翻訳する必要があることを指定します。
<column name="language_id" type="string" constant="us" translate="yes"/>
対照的に、次のtranslate属性は、この列と一致する名前を持つデータセット・セクション内のデータの翻訳を要求します。
<column name="message" type="string" translate="yes"/>
たとえば、前述の要素は、データセット・セクション内の次のメッセージを翻訳する必要があることを指定します。
<col name="message" translation-note="dnt'X'">Welcome to System X</col> <col name="message">Please enter username and password</col>
アプリケーションのメッセージを翻訳するとき、指定した語句を未翻訳のままにする必要がある場合もあります。前述の例に示したtranslation-note属性は、この目的を果します。
XSLTプロセッサは、前の形式を別の形式に変換できます。これによって、ローカライゼーション・サービス・プロバイダ間で翻訳データを交換し、XMLベースの翻訳ツールで使用できます。この変換により、開発者は、リビジョンの追跡や翻訳可能な文字列の単位としての分類などのタスクを行う必要がありません。
例12-6 example_es.xml
<?xml version="1.0"?> <table xml:lang="es" name="translated_messages"> <!-- Specify the unique identifier --> <lookup-key> <column name="message_id" /> <column name="language_id" /> </lookup-key> <!-- Specify the columns into which data will be inserted --> <columns> <column name="message_id" type="number"/> <column name="language_id" type="string" constant="es" translate="yes"/>
例12-7に、翻訳後の例12-4の文書を示します。先ほどの例と異なり、列定義は変更されません。
例12-7 language属性を持つexample_es.xml
<?xml version="1.0"?>
<table xml:lang="es" name="translated_messages">
<!-- Specify the unique identifier -->
<lookup-key>
<column name="message_id" />
<column name="language_id" />
</lookup-key>
<!-- Specify the columns into which data will be inserted -->
<columns>
<column name="message_id" type="number"/>
<column name="language_id" type="string" language="%x"/>
:
:
翻訳処理中にテキスト・エディタまたは従来のテキストベースの翻訳ツールを使用する場合は、文書のエンコーディングを保持することが重要です。翻訳後の文書は、元の文書とエンコーディングが異なる可能性があります。「DLFでのXML宣言」で説明しているように、翻訳済の文書のエンコーディングがUnicode以外の場合は、最初の行のXML宣言にエンコーディング宣言を追加します。Unicode以外のエンコーディングの宣言は、次のようになります。
<?xml version="1.0" encoding="ISO-8859-15"?>
翻訳処理で構文の整合性が損われていないことを確認するには、文書をXMLとして処理します。それ以外の場合は、コマンドライン・インタフェースの-vオプションを指定して、形式を確認できます。構文エラーが存在する場合は、エラーの場所と説明が出力されます。データ転送を正常に実行するには、エラーを修正する必要があります。
例12-3および例12-8のサンプル文書を例12-1で作成したtranslated_messages表にロードする場合を考えます。TransXデモ・ディレクトリにある例12-8のサンプル・プログラムを使用して、データをロードできます。
例12-8 txdemo1.java
// Copyright (c) 2001 All rights reserved Oracle Corporation
import oracle.xml.transx.*;
public class txdemo1 {
/**
* Constructor
*/
public txdemo1() {
}
/**
* main
* @param args
*
* args[0] : connect string
* args[1] : username
* args[2] : password
* args[3+] : xml file names
*/
public static void main(String[] args) throws Exception {
// instantiate a transx class
TransX transx = loader.getLoader();
// start a data loading session
transx.open( args[0], args[1], args[2] );
// specify operation modes
transx.setLoadingMode( LoadingMode.SKIP_DUPLICATES );
transx.setValidationMode( false );
// load the dataset(s)
for ( int i = 3 ; i < args.length ; i++ )
{
transx.load( args[i] );
}
// cleanup
transx.close();
}
}
txdemo1.javaプログラムは次の手順を実行します。
TransXローダー・オブジェクトを作成します。次に例を示します。
TransX transx = loader.getLoader();
データ・ロード・セッションをオープンします。最初の3つのコマンドライン・パラメータは、JDBC接続文字列、データベース・ユーザー名およびデータベース・パスワードです。これらのパラメータは、TransX.open()メソッドに渡されます。プログラムには次の文が含まれます。
transx.open( args[0], args[1], args[2] );
TransXローダーを構成します。重複した行をスキップし、入力データセットを検証するようにローダーを構成します。プログラムには次の文が含まれます。
transx.setLoadingMode( LoadingMode.SKIP_DUPLICATES ); transx.setValidationMode( false );
データをロードします。最初の3つのコマンドライン・パラメータは、接続情報を指定します。その他のパラメータは、入力XML文書を指定します。プログラムは、指定されたすべての文書に対してload()メソッドを起動します。
for ( int i = 3 ; i < args.length ; i++ )
{
transx.load( args[i] );
}
データ・ロード・セッションをクローズします。プログラムには次の文が含まれます。
transx.close();
javacを使用してプログラムをコンパイルした後、コマンドラインからプログラムを実行できます。次の例では、シンJavaドライバを使用して、コンピュータmyhostのポート1521でインスタンスmydbに接続します。userスキーマに接続し、XML文書example.xmlおよびexample_es.xmlをロードします。
java txdemo1 "jdbc:oracle:thin:@//myhost:1521/mydb" user -pw example.xml
example_es.xml
通常、多言語ソフトウェア・システムの構築では、翻訳されたメッセージは開発の後半段階で使用可能になります。また、長期間かけて徐々に改善される傾向にあります。データベースにメッセージを追加する必要がある場合は、TransX Utilityをもう一度実行して、<dataset>定義に新しい行を追加できます。TransXは新しい行を認識し、<lookup-key>セクションに指定された列に基づいて新しいメッセージのみを挿入します。一部のメッセージが更新された場合は、-uオプションを指定してTransXを実行して、XML内に指定されたデータで既存の行を更新します。次に例を示します。
transx -u "jdbc:oracle:thin:@//myhost:1521/mydb" user -pw example.xml
example_es.xml
例12-8のプログラムを使用してデータをロードした後、translated_messages表に問合せを行って結果を確認できます。次のような結果が表示されます。
MESSAGE_ID LANGUAGE_ID MESSAGE ---------- ----------- ---------------------------------- 1 us Welcome to System X 1 es Bienvenido al Sistema X 2 us Please enter username and password 2 es Porfavor entre su nombre de usuario y su contraseña
WHERE句でlanguage_idおよびmessage_id列を使用して、アプリケーションで特定の言語のメッセージを取得できます。たとえば、次の問合せを実行できます。
SELECT message FROM translated_messages WHERE message_id = 2 AND language_id = 'es'; MESSAGE ---------------------------------- Porfavor entre su nombre de usuario y su contraseña