サンプル: 名前別にノードをグループ化またはフィルターする

www.altova.com このトピックを印刷 前のページ 1つ上のレベル 次のページ

ホーム >  マッピングのデザイン > ノード名のマッピング >

サンプル: 名前別にノードをグループ化またはフィルターする

この例は、 XML プロパティリスト(または XML プロパティリスト)からキー値ペアを読み取り CSV ファイルへ書き込むマッピングをデザインする方法を説明します。(XML プロパティリストは、 macOS と iOS オブジェクトの情報を XML フォーマットで保存する方法を示します。詳細に関しては、次を参照してください: https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/PropertyLists/UnderstandXMLPlist/UnderstandXMLPlist.html。) このサンプルは、マッピングサンプルが伴い、次のパスで検索することができます: <マイ ドキュメント>\Altova\MapForce2019\MapForceExamples\Tutorial\ReadPropertyList.mfd

 

下のコードリストはソース XML ファイルを表しています。

 

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist SYSTEM "https://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
  <dict>
    <key>First Name</key>
    <string>William</string>
    <key>Last Name</key>
    <string>Shakespeare</string>
    <key>Birthdate</key>
    <integer>1564</integer>
    <key>Profession</key>
    <string>Playwright</string>
    <key>Lines</key>    
    <array>
        <string>It is a tale told by an idiot,</string>
        <string>Full of sound and fury, signifying nothing.</string>
    </array>
  </dict>
</plist>

 

マッピングの目的は、プロパティリストファイル内の <dict> ノードの下で検出された特定の キー値ペアから CSV ファイル内に新しいラインを作成することです。 具体的には、マッピングは <key> - <string> ペアのみをフィルターしなくてはなりません。 他のキー値ペア (例えば、 <key> - <integer>) は、無視されます。CSV ファイル内で、リストは、プロパティの値からコンマで区切られているプロパティ名を保存しなくてはなりません。 すなわち、出力は以下のようになります:

 

First Name,William

Last Name,Shakespeare

Profession,Playwright

 

この目的を達成するには、マッピングは、 dict ノードのすべての子ノードへの「動的」なアクセスを使用します。第2に、 XML ファイルから取得されたマッピングはキー値ペアをグループ化するために group-starting-with 関数を使用します。最後に、マッピングは、フィルターを使用してノード名が「文字列」であるノードをフィルターします。

 

下のステップは必要とされるマッピングの作成方法を示しています。

 

 

ステップ 1: ソース XML コンポーネントをマッピングに追加する

「挿入」 メニューから「XML スキーマ/ファイル」をクリックします。次のファイルを参照します: <マイ ドキュメント>\Altova\MapForce2019\MapForceExamples\Tutorial\plist.xml。 この XML ファイル は、同じフォルダー内の plist.dtd スキーマを指します。

 

 

ステップ 2: マッピングにターゲット CSV コンポーネントを追加する

1.「挿入」 メニューから「テキストファイル」 をクリックします。プロンプトされると、 「標準 CSVのための単純処理を使用する...」 オプションを選択します。
2.「フィールドの追加」をクリックして、 CSV フィールドをコンポーネンに追加します。ト
3.各フィールド名をダブルクリックして、最初のフィールド名として 「Key」を入力し、「Value」 を2番目のフィールドの名前として入力します。「Key」 フィールドは、プロパティ名を保管し、「Value」フィールドはプロパティの値を保管します。CSV コンポーネントの詳細に関しては、次を参照してください: CSV とテキストファイル.

mf_map_ReadPropertyList_01

 

ステップ 3: フィルター と関数を追加する

1. equal, existsgroup-starting-with 関数をライブラリウィンドウからドラッグしマッピングにドロップします。関数に関する一般的情報は次を参照してください : 関数との作業.
2.フィルターを追加するには、 「挿入」 メニューから「Filter: Nords/Rows」をクリックします。フィルター に関する一般的情報は次を参照してください: フィルターと条件
3.「挿入」 メニューから「定数」をクリックし、テキスト 「string」を入力します。
4.ソースコンポーネント内で、 dict ノードを右クリックし、コンテキストメニューから「動的な名前を持つ子要素を表示する」を選択します。 「動的に名前がつけられた子の設定」 ダイアログボックスでは、「ノード名を固定し、要素をフィルター、または、作成するために名前テストノードを表示する 」のチェックボックスが選択されていることを確認してください。

 

mf_map_ReadPropertyList_02

 

5.下に表示されるように接続を描きます。

mf_map_ReadPropertyList

ReadPropertyList.mfd

 

マッピングの説明

ソースコンポーネント上の要素() アイテムは、 dict ノードの全ての子を group-starting-with 関数へのシーケンスとして提供します。group-starting-with 関数は、 名前 key を持つノードが発生すると新しいグループを作成します。 exists 関数は、この条件をチェックして、結果をブール値 true/false としてグループ関数に返します。

 

各グループのために、フィルターは、 equal 関数を使用して現在のノードが「文字列」と等しいかをチェックします。名前自身は、文字列としてノードの名前を与えるlocal-name() から読み込まれます。

 

ターゲットコンポーネントへの接続には以下の役割があります:

 

フィルターの条件が、 true の場合のみ、新しい行がターゲット CSV 内に作成されます。
Key  (プロパティ名) は、ソース内の key 要素の値から得られます。
Value  (プロパティ値) は、 string 名前 テスト ノードから得られます。

(C) 2019 Altova GmbH