第3章 実習T2Xスタジオ
この章では例題を用いてテキストファイルをXMLに変換するための変換規則の作成方法を実習します。T2Xスタジオの起動と各部の名称に関しては「4.1 T2Xスタジオの起動と各部の名称」をご覧下さい。また文字列抽出パターンとして正規表現を用いています。正規表現に関しては「第5章 正規表現」をご覧下さい。
- 3.1 テキストファイルの確認
- 3.2 新しい変換規則の作成
- 3.3 デバッグの準備
- 3.4 ルートノードの設定
- 3.5 ルートノードで部分文字列を作成
- 3.6 ルートノードにノードを追加
- 3.7 発送情報ノードで部分文字列を作成
- 3.8 発送情報ノードにノードを追加
- 3.9 商品情報ノードで部分文字列を作成
- 3.10 商品情報ノードにノードを追加
- 3.11 変換規則の保存
- 3.12 XMLファイルの作成
3.1 テキストファイルの確認
実習に用いる入力テキストファイルは次の通りです。
下記の通り注文を承りました。 越前屋馬衛門
[日時]
2009-11-21 11:48:27
[注文者]
橋本佐内 様
〒616-8101 京都市右京区太秦和泉式部町
==========
[送付先]
松平春岳 様
[商品]
釜茹 越前がに特上(100010)
価格 18000(円) x 2(個) = 36000(円)
----------
福井名物 羽二重餅(100110)
価格 800(円) x 2(個) = 1600(円)
[送付先]
坂本竜馬 様
[商品]
三国港 活甘エビ子持ち 大50尾入(100030)
価格 6000(円) x 1(個) = 6000(円)
3.2 新しい変換規則の作成
新しい変換規則を作成するにはメインメニューより「ファイル(F)」「新規作成(N)」を選びます。画面のタイトルバーに「新しい変換規則.t2x」と表示されます。
3.3 デバッグの準備
デバッグとは作成した変換規則が正しく動くかをテストすることです。デバッグは全ての変換規則を作ってから行ってもいいのですが、変換規則を一つづつ作りながらその都度確認する方法も効率的です。そのために予めデバッグのための設定を行っておきます。
メインメニューの「デバッグ(D)」から「テスト用ファイルの設定(T)」を選択し、テスト用の入力ファイルと、変換結果の出力ファイルを設定して下さい。
入力ファイルにはインストール先フォルダにある「実習.txt」を設定して下さい。出力結果ファイルには任意のフォルダに適当な名前で出力するように設定して下さい。
3.4 ルートノードの設定
XMLノードビューのルートノードをクリックすると、ノード編集ペインにはルートノード設定項目が表示されます。ここではXML宣言やルート要素などのXMLファイルを作るための基本的な設定を行います。
(注)DOMではXML宣言やルート要素はルートノードの直下のノードですが、T2Xではまとめて設定します。
入力テキスト
T2Xコンバータには複数の変換規則を登録することができます。複数の変換規則が登録されている場合は、どの変換規則を適用するかは自動的に判断されます。その場合の判断の基準となるのが識別パターンであり、どの変換規則が適用されたかを識別するのが規則IDです。
規則ID
変換規則を識別するための任意の文字列を設定して下さい。実習ではJISSYUと設定します。
識別パターン
入力テキストがこの変換規則で処理できる正しいファイルであるかを識別するための正規表現パターンです。入力テキストにこのパターンとマッチする部分があれば、正しいテキストと看做します。
実習では次のような識別パターンを設定します。
注文.*越前屋馬衛門
この識別パターンにより、同一行に「注文」と「越前屋馬衛門」という文字があればこの変換規則用の正しいテキストであると判断されます。
XML宣言
XMLのバージョン指定、エンコーディング指定、スタンドアロン指定を行います。
バージョン
XMLのバージョンです。1.0で固定です。
エンコーディング
XMLの文字エンコーディングをコンボボックスより選択します。省略を選ぶとエンコーディング指定は出力されません。実習では UTF-8 を選んで下さい。
スタンドアロン
XMLのスタンドアロン宣言をコンボボックスより選択します。省略を選ぶとスタンドアロン宣言は出力されません。実習では省略を選んで下さい。
テキスト名
入力テキスト全体を表す任意の名前を付けて下さい。実習では「注文書」と名前を付けます。
ルート要素名
XMLのルート要素名を指定します。省略可能です。省略するとテキスト名と同じになります。実習では省略します。
名前空間URI
このXML文書のデフォルトの名前空間URIを指定します。省略した場合はデフォルトの名前空間URIは宣言されません。実習では省略します。
更新
更新ボタンを押してルートノードの設定を更新します。更新ボタンを押さなければ更新されません。更新するとルートノードのテキストは「注文書」に変わります。
3.5 ルートノードで部分文字列を作成
ルートノード(T2Xではルート要素も兼ねる)に子ノードを追加するには、その準備として子ノードに割り当てる文字列を作成する必要があります。ルートノードには注文書という名前で入力テキストの全文が割り当てられています。この注文書という名前の文字列より、名前を付けた部分文字列を作成し、これを子ノードに割り当てることになります。実習では注文書という名前の文字列より、注文日、注文者情報、発送情報という名前で3種の部分文字列を作成します。これらの部分文字列はは次のようになるようにします。
注文日
2009-11-21
注文者情報
橋本佐内 様
〒616-8101 京都市右京区太秦和泉式部町
発送情報(1)
[送付先]
松平春岳 様
[商品]
釜茹 越前がに特上(100010)
価格 18000(円) x 2(個) = 36000(円)
----------
福井名物 羽二重餅(100110)
価格 800(円) x 2(個) = 1600(円)
発送情報(2)
[送付先]
坂本竜馬 様
[商品]
三国港 活甘エビ子持ち 大50尾入(100030)
価格 6000(円) x 1(個) = 6000(円)
上記のように発送情報は2つできます。
注文日抽出規則の作成
ルートノードに新しい文字列抽出規則を追加するにはルートノードを選択し、抽出規則リストツールバーのボタンを押します。抽出規則リストに「新しい抽出規則」が追加されます。
新しい文字列抽出規則を追加すると抽出規則編集ペインは新しい設定になりますので、ここに文字列抽出規則を設定します。注文日抽出のための規則は次のように設定します。
入力文字列名
文字列抽出のソースとなる入力文字列の名前をコンボボックスより選択します。この段階ではXMLノードビューのノードに割り当てられている文字列の名前しか選べません。実習では「注文書」を選択します。
抽出パターン
入力文字列より注文日を抽出するための正規表現パターンを設定します。次のようなパターンを設定します。
\[日時\]\s*\n(?<注文日>\d+-\d+-\d+)
( ) で囲まれた部分をグループといい、?<注文日>でグループに注文日という名前が付きます。また \d+-\d+-\d+ で 注文日を抽出します。この抽出パターンにより、注文日と名付けられた 2009-11-21 という文字列が得られます。
抽出オプション
指定不要です。
最大繰返し回数
注文日は一つしかないので 1 として下さい。
注文日抽出規則の確認
上で作成した抽出規則が正しく動くか確認します。動作確認を行う規則を抽出規則リストで選択し、デバッグツールバーにあるボタンを押します。デバッグペインには抽出規則の入力文字列が表示され、パターンにマッチした文字列は緑色の背景色で、グループにマッチした部分は赤色の文字で表されます。
パターンにマッチしない場合は全体がグレーになります。予期した結果にならない場合は、抽出パターンを修正して、再試行して下さい。
注文者情報抽出規則の作成
同様に注文者情報抽出規則を追加します。ルートノードを選択し、抽出規則リストツールバーのボタンを押し、抽出規則編集ペインに次のように設定します。
入力文字列名
「注文書」を選択します。
抽出パターン
次のような抽出パターンを設定します。
\[注文者\]\s*\n(?<注文者情報>(.*\n)*?)={10}
この抽出パターンにより、注文者情報と名付けられた 文字列が得られます。
抽出オプション
指定不要です。
最大繰返し回数
注文者情報は一つしかないので 1 として下さい。
発送情報抽出規則の作成
同様に発送情報抽出規則を追加します。ルートノードを選択し、抽出規則リストツールバーのボタンを押し、抽出規則編集ペインに次のように設定します。
入力文字列名
「注文書」を選択します。
抽出パターン
次のような抽出パターンを設定します。
(?<発送情報>\[送付先\]\s*\n(.*\n)*?)($|(?=\[送付先\]))
この抽出パターンにより、発送情報と名付けられた 文字列が複数得られます。このパターンには正規表現の最短マッチと先読みの機能が使われています。
抽出オプション
指定不要です。
最大繰返し回数
発送情報は複数あるので 0 として下さい。0は回数無制限を現します。
複数の発送情報が抽出されているのを確認するには、デバッグツールバーにあるボタンを押し最初の抽出を確認し、次にを押して次の抽出を確認します。
注文者名の抽出
部分文字列抽出規則で作られた部分文字列は、それを入力文字列とした抽出規則でさらに再抽出することができます。ここでは注文者情報
橋本佐内 様
〒616-8101 京都市右京区太秦和泉式部町
より注文者名、注文者郵便番号、注文者住所を抽出します。最初に注文者名を抽出します。
ルートノードを選択し、抽出規則リストツールバーのボタンを押し、抽出規則編集ペインに次のように設定します。
入力文字列名
「注文者情報」を選択します。
抽出パターン
次のような抽出パターンを設定します。
(?<注文者名>.*?)\s*様
この抽出パターンにより、注文者名が得られます。
抽出オプション
指定不要です。
最大繰返し回数
一つしかないので 1 として下さい。
注文者郵便番号、注文者住所の抽出
同様に注文者郵便番号、注文者住所を抽出します。
入力文字列名
「注文者情報」を選択します。
抽出パターン
次のような抽出パターンを設定します。
〒\s*(?<注文者郵便番号>\d\d\d-\d\d\d\d)\s*(?<注文者住所>.*)
この抽出パターンにより、注文者郵便番号と注文者住所の二つの部分文字列が得られます。
抽出オプション
指定不要です。
最大繰返し回数
一つしかないので 1 として下さい。
(注)抽出規則を分ける
次のような抽出パターンを用いれば注文者名、注文者郵便番号、注文者住所を1つの抽出規則で抽出することもできます。
(?<注文者名>.*?)\s*様\n〒\s*(?<注文者郵便番号>\d\d\d-\d\d\d\d)\s*(?<注文者住所>.*)
ただしこのようにした場合は、パターンにマッチしない場合は注文者名、注文者郵便番号、注文者住所のどれも得られません。一方2つに分けた場合は、いずれかマッチした方は得られます。例えば住所の行がなくても注文者名は得ることができます。このように入力テキストで省略される可能性のある場合は抽出規則を分けたほうがよいでしょう。上記の場合、郵便番号と住所を分ければ、郵便番号が省略されても住所だけでも得るようにすることも可能です。
3.6 ルートノードにノードを追加
次に、ルートノードで抽出した部分文字列をルートノードの子ノードとして追加します。DOMと異なりT2Xではルートノードはルート要素も兼ねています。実習ではルートノード(注文書要素)に、注文日、注文者名、注文者郵便番号、注文者住所、注文伝票の各要素ノードを追加します。ノードツールバーのボタンを押し新しいノードを追加すると、 ノード編集ペインには新しいノードの設定項目が表示されます。
まず最初に注文日要素ノードを作ります。
ノードの種類
注文日は注文書要素の子要素ですので、ノードの種類として子要素を選択します。
抽出文字列名
「3.5 ルートノードで部分文字列を作成」で作られた部分文字列を名前で指定します。コンボボックスに指定できる文字列名が表示されます。ここでは「注文日」を選択します。
要素名
XMLの要素名を指定します。省略すると抽出文字列名と同じになります。ここでは省略します。
空要素も出力する
ノードの種類が要素の場合に、空要素であっても出力するかを指定します。実習では空要素を出さないのでチェックをしません。
更新
更新ボタンを押してノードの設定を更新します。更新ボタンを押さなければ更新されません。更新するとノードのテキストは「注文日」に変わります。
同様に、注文者名、注文者郵便番号、注文者住所、注文者電話番号、注文伝票の各要素ノードを追加して下さい。注文伝票は複数ありますが、T2Xの設定は1つだけです。
(注)ノードの追加と部分文字列
ノードを追加すると抽出文字列名に該当する部分文字列がノードに割り当てられます。この部分文字列の使われ方はノード種類により異なります。ノードの種類が属性の場合は属性の値となります。ノードの種類がテキストの場合は親要素のテキストになります。ノードの種類が子要素の場合、子要素の子要素(孫要素)がない場合は子要素のテキストになり、孫要素がある場合は、孫要素のための部分文字列を抽出するための入力文字列となります。
3.7 発送情報ノードで部分文字列を作成
これまでの処理でノードビューは次のようになっています。
次は発送情報ノードに子ノードを作ります。その準備として発送情報ノードに割り当てられている文字列から必要な部分文字列を作成します。実習では発送情報は2つありますが、1つは次のような内容です。
[送付先]
松平春岳 様
[商品]
釜茹 越前がに特上(100010)
価格 18000(円) x 2(個) = 36000(円)
----------
福井名物 羽二重餅(100110)
価格 800(円) x 2(個) = 1600(円)
これから、送付先名と商品情報という名前で部分文字列を抽出します。これらの部分文字列は次のようになるようにします。
送付先名
松平春岳
商品情報(1)
釜茹 越前がに特上(100010)
価格 18000(円) x 2(個) = 36000(円)
商品情報(2)
福井名物 羽二重餅(100110)
価格 800(円) x 2(個) = 1600(円)
上記のように商品情報は2つできます。
送付先名抽出規則の作成
発送情報ノードに新しい文字列抽出規則を追加するには発送情報ノードを選択し、抽出規則リストツールバーのボタンを押します。送付先名抽出のための規則は次のように設定します。
入力文字列名
コンボボックスより「発送情報」を選択します。
抽出パターン
次のような抽出パターンを設定します。
\[送付先\]\s*(?<送付先名>.*)
この抽出パターンにより、送付先名と名付けられた 文字列が得られます。
抽出オプション
指定不要です。
最大繰返し回数
入力文字列中に送付先名は一つしかないので 1 として下さい。
商品情報抽出規則の作成
同様に商品情報抽出規則を追加します。商品情報抽出のための規則は次のように設定します。
入力文字列名
コンボボックスより「発送情報」を選択します。
抽出パターン
次のような抽出パターンを設定します。
(\[商品\]\s*|-{10})\n(?<商品情報>(.*\n)*?)(?=($|-{10}))
この抽出パターンにより、商品情報と名付けられた 文字列が複数得られます。
抽出オプション
指定不要です。
最大繰返し回数
商品情報は複数あるので 0 として下さい。0は回数無制限を現します。
3.8 発送情報ノードにノードを追加
発送情報ノードで抽出した部分文字列を発送情報ノードの子ノードとして追加します。実習では発送情報ノードに、送付先名、商品情報の各要素ノードを追加します。ノードツールバーのボタンを押し新しいノードを追加すると、 ノード編集ペインには新しいノードの設定項目が表示されます。まず最初に送付先名ノードを作ります。
ノードの種類
送付先名は注文書要素の子要素ですので、ノードの種類として子要素を選択します。
抽出文字列名
「3.7 発送情報で部分文字列を作成」で作られた部分文字列名をコンボボックスより選択します。ここでは「送付先名」を選択します。
要素名
XMLの要素名を指定します。省略すると抽出文字列名と同じになります。ここでは省略します。
空要素も出力する
ノードの種類が要素の場合に、空要素であっても出力するかを指定します。実習では空要素を出さないのでチェックをしません。
更新
更新ボタンを押してノードの設定を更新します。更新ボタンを押さなければ更新されません。更新するとノードのテキストは「送付先名」に変わります。
同様に、商品情報の要素ノードを追加して下さい。商品情報は複数ありますが、T2Xの設定は1つだけです。
3.9 商品情報ノードで部分文字列を作成
これまでの処理でノードビューは次のようになっています。
次は商品情報ノードに子ノードを作ります。その準備として商品情報ノードに割り当てられている文字列から必要な部分文字列を作成します。実習では商品情報は2つありますが、1つは次のような内容です。
釜茹 越前がに特上(100010)
価格 18000(円) x 2(個) = 36000(円)
これから、商品名、商品コード、単価、数量、金額という名前で部分文字列を抽出します。これらの部分文字列は次のようになるようにします。
商品名
釜茹 越前がに特上
商品コード
100010
単価
18000
数量
2
金額
36000
商品名と商品コードの抽出規則
商品情報ノードを選択し、抽出規則リストツールバーのボタンを押します。商品名と商品コード抽出のための規則は次のように設定します。
入力文字列名
コンボボックスより「商品情報」を選択します。
抽出パターン
次のような抽出パターンを設定します。
(?<商品名>.*?)\((?<商品コード>.*?)\)
この抽出パターンにより、商品名と商品コードと名付けられた 部分文字列が得られます。
抽出オプション
指定不要です。
最大繰返し回数
1行目だけを対象とするので 1 として下さい。
単価、数量、金額の抽出規則
同様に単価、数量、金額の抽出規則を追加します。次のように設定します。
入力文字列名
コンボボックスより「商品情報」を選択します。
抽出パターン
次のような抽出パターンを設定します。
価格\s*(?<単価>\d+)\(円\)\s*x\s(?<数量>\d+)\(個\)\s*=\s(?<金額>\d+)\(円\)
この抽出パターンにより、単価、数量、金額に対応する部分文字列が得られます。
抽出オプション
指定不要です。
最大繰返し回数
一つしかないので 1 として下さい。
3.10 商品情報ノードにノードを追加
商品情報ノードで抽出した部分文字列を商品情報ノードの子ノードとして追加します。実習では商品情報ノードに、商品コード、商品名、数量、単価、金額の各要素ノードを追加します。ノードツールバーのボタンを押し新しいノードを追加すると、 ノード編集ペインには新しいノードの設定項目が表示されます。まず最初に商品コードノードを作ります。
ノードの種類
商品コードは商品情報要素の子要素ですので、ノードの種類として子要素を選択します。
抽出文字列名
「3.9 商品情報で部分文字列を作成」で作られた部分文字列名をコンボボックスより選択します。ここでは「商品コード」を選択します。
要素名
XMLの要素名を指定します。省略すると抽出文字列名と同じになります。ここでは省略します。
空要素も出力する
ノードの種類が要素の場合に、空要素であっても出力するかを指定します。実習では空要素を出さないのでチェックをしません。
更新
更新ボタンを押してノードの設定を更新します。更新ボタンを押さなければ更新されません。更新するとノードのテキストは「商品コード」に変わります。
同様に、商品名、数量、単価、金額の各要素ノードを追加して下さい。
3.11 変換規則の保存
これまでの処理でノードビューは次のようになっています。
これで変換規則は完成です。名前を付けて変換規則をファイルに保存して下さい。ファイルに保存するにはメインメニューの「ファイル(F)」「名前を付けて保存(A)」を実行します。
3.12 XMLファイルの作成
デバッグは前述のように現在選択されている変換規則まで実行する方法の他に、1ステップづつ実行する方法、ブレークポイントの設定されている変換規則まで実行する方法、および全ての変換規則を一気に実行する方法があります。いずれの場合も最後までデバッグを行うと、
と表示されます。「はい」を押すとXMLファイルが所定の場所に作成されます。また、デバッグを行わずに直接XMLファイルに変換することもできます。この場合はメインメニューの「デバッグ(D)」「デバッグなしで変換を実行(E)」を選択します。
いずれの場合も変換後、結果表示ウィンドウが開き、変換されたXMLファイルの内容がが表示されますので、変換内容を確認することができます。