レコードからXMLを出力時に同一内容のレコードを別ノードにする

Mapperコンポーネントを使ってレコードデータからXMLを生成するマッピング処理では、出力側XMLの繰り返し出現する要素に対して入力側レコードが同一内容である場合、出力は1つになります。

次のデータを【出力XML】のように生成する処理を例に説明します。

【データ例1】
2222,ビデオカメラ,3000
2222,デジカメ,4000
2222,スキャナー,5000

【出力XML】
<root>
    <注文伝票 注文番号="2222">
        <商品 商品名="ビデオカメラ" 金額="3000"/>
        <商品 商品名="デジカメ" 金額="4000"/>
        <商品 商品名="スキャナー" 金額="5000"/>
    </注文伝票>
</root>

次の【データ例2】のように繰り返し部分が全く同じデータの場合、出力後のXMLでは1レコードとしてまとめられます。
そのため、データ例1とデータ例2の出力XMLのノード数は同じになります。

【データ例2】
2222,ビデオカメラ,3000
2222,デジカメ,4000
2222,デジカメ,4000
2222,デジカメ,4000
2222,スキャナー,5000

【出力XML】
<root>
    <注文伝票 注文番号="2222">
        <商品 商品名="ビデオカメラ" 金額="3000"/>
        <商品 商品名="デジカメ" 金額="4000"/> ←★1レコードにまとめられる
        <商品 商品名="スキャナー" 金額="5000"/>
    </注文伝票>
</root>

フローサービスマニュアルの「はじめに」-「詳細なトピック」-「フローの構成要素」-「マッパー」で、レコードデータからXMLを生成するマッピング処理について解説しています。このページで「出力側でのXMLの構成」の5番目の項目で解説しているとおり、XMLの出力については「完全に構成要素が同一のノードは、同一レコードとみなしマッピングを行わない」というASTERIA Warpの仕様になります。

【データ例2】のケースで、次のようにレコード数分すべて別ノードとして出力したい場合には、ASTERIA Warpの特殊な名前空間『http://www.infoteria.com/asteria/mapper/void』を使います。名前空間を使って定義した属性は出力結果に反映されないため、一意の値を使ってレコード数分すべて別ノートに出力することができます。
詳しくは上記マニュアルの「特殊なNamespace」を参照してください。

【出力XML】
<root>
    <注文伝票 注文番号="2222">
        <商品 商品名="ビデオカメラ" 金額="3000"/>
        <商品 商品名="デジカメ" 金額="4000"/> ←★別ノードで出力する
        <商品 商品名="デジカメ" 金額="4000"/> ←
        <商品 商品名="デジカメ" 金額="4000"/> ←
        <商品 商品名="スキャナー" 金額="5000"/>
    </注文伝票>
</root>

【データ例2】を使ってマニュアルの手順を説明します。

  1. Mapperコンポーネントのストリームタブの「名前空間」プロパティをクリックします。
  2. 表示された画面で次の情報を追加して「OK」をクリックします。
    Prefix : x
    URI : http://www.infoteria.com/asteria/mapper/void
    adn_namespace.png
  3. ストリーム定義に定義されます。
    adn_namespace2.png
  4. ストリーム定義のXMLで要素「商品」に属性を追加します。
    以下は追加前です。
    adn_namespace3.png
  5. 要素「商品」に属性名「@x:recNo」を追加します。
    adn_namespace4.png
  6. マッピングウィンドウで、一意の値(例えばレコード番号など)を@x:recNoにマッピングします。
    adn_namespace5.png


※上記のPrefix、属性名は例です。任意の名前をつけることができます。
※上記のレコード番号は例です。一意の値であればどのようなフィールドでも利用できます。

 
 
この記事は役に立ちましたか?
0人中0人がこの記事が役に立ったと言っています

他のキーワードで検索する