特定の型のノードへのアクセス

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

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

特定の型のノードへのアクセス

前のセクションで説明されているとおり、 ノード名へのアクセスの取得 は、ノードを右クリックして「動的な名前を持つ子要素を表示する」 コンテキストメニュー コマンドを選択し、ノードの全ての子要素にアクセスすることができます。特定の型のノードにより値をアクセスすることはできますが、マッピングのランタイムでは、 node-name() ノードから各子要素の名前にアクセスすることができます。下のイメージでは、  型キャストノードは、text()ノードの横にあります。

mf_generic_child_elements

 

子要素のデータ型は、マッピングのランタイム前にはわかりません。  また、各子要素により異なる可能性があります。例えば、 XML インスタンス ファイル内の product ノード は、型 xs:integer の子要素 id と型 xs:string の 子要素 size を持つ可能性があります。特定の型のノードコンテンツにアクセスするには、下に表示されるダイアログボックスがノードの子要素への動的なアクセスを有効化するたびに開かれます。 element() ノードの横の「選択の変更」 ( mf_ic_change_selection )ボタンをクリックすることにより、このダイアログボックスを後で開くことができます。

mf_dynamic_node_names_02

「動的に名前がつけられた子の設定」 ダイアログボックス

マッピングのランタイムに各子要素のコンテンツにアクセスするには、いくつかのオプションがあります:

 

1.コンテンツを文字列としてアクセスするには、上のダイアログボックスで text() チェックボックスを選択します。この場合、ダイアログボックスが閉じられると、 text() ノードがコンポーネント上に作成されます。このオプションは、コンテンツが(xs:int、 xs:string などの)単純型 の場合、適切です。例: 要素名を属性値にマップするで詳しく説明されています。text() ノードは、現在のノードの子ノードがテキストを含むことができる場合表示されることに注意してください。
2.スキーマに許可されている特定の複合型としてコンテンツにアクセスすることができます。カスタム複合型が、選択されているのためにノードグローバルに許可されていると、上のダイアログボックスで使用することが可能になり、横のチェックボックスを選択することができます。上のイメージでは、グローバルに定義されている複合型は存在せず、この選択は使用することができません。
3.コンテンツを型としてアクセスする。これは、高度のマッピングのシナリオで役に立ちます  (次を参照してください: 「更に深い構成にアクセスする」を参照してください)。これを行うには、 xs:anyType の横のチェックボックスを選択してください。

 

マッピング ランタイムでは、 MapForce ( 型 キャストノードを介して) には、実際のインスタンスノード型に関する情報がないことに注意してください。ですから、マッピングは、正確な型を使用してノードコンテンツにアクセスする必要があります。例えば、 ソース XML インスタンスが多種の複合型の子ノードを持つことを希望する場合、以下を行います:

 a) 型キャストノードを一致させる必要が有る複合型に設定します (上のリストの2番目のアイテムを参照してください)。

 b) 一致する必要のあるインスタンスのみから読み込むためにフィルターを追加します。詳細に関しては以下を参照してください: フィルターと条件

 

更に深い構成にアクセスする

スキーマ ワイルドカードの選択により、ノードをノードの直下の子よりもスキーマ内の更に深いレベルでアクセスすることができます。高度なマッピングのシナリオではとても役に立ちます。マッピングは、 XML ノードの直下の子しかアクセスすることができないため、例: 要素名を属性値にマップする 等の簡単なマッピングでは、このテクニックを必要としません。しかしながら、動的に更に深い構造にアクセスする必要がある場合、例えば「孫」にアクセスが必要な場合、以下の方法でアクセスすることが可能です。

 

1.新規マッピングを作成する。
2.挿入メニューから「XML スキーマ/ファイルを挿入する」をクリックし、 XML インスタンスファイルを参照します。(子の例では、 <マイ ドキュメント>\Altova\MapForce2019\MapForceExamples\Tutorial\ フォルダーからの Articles.xml ファイルです)。
3.Articles ノードを右クリックして、「動的な名前を持つ子要素を表示する」 コンテキストコマンドを選択します。
4.「動的に名前がつけられた子の設定」 ダイアログボックスから xs:anyType を選択します。
5.xs:anyType ノードを右クリックして、 「動的な名前を持つ子要素を表示する」 コンテキストコマンドに対して選択します。
6.動的に名前がつけられた子の設定」 ダイアログボックスから text() を選択します。

 

mf_generic_grandchildren

 

上記のコンポーネントで、2つの element() ノードが存在することに注目してください。2番目の element() ノードは、 Articles.xml インスタンス内の <Articles> ノードの孫に動的なアクセスを与えます。

 

 

<?xml version="1.0" encoding="UTF-8"?>
<Articles xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="Articles.xsd">
  <Article>
    <Number>1</Number>
    <Name>T-Shirt</Name>
    <SinglePrice>25</SinglePrice>
  </Article>
  <Article>
    <Number>2</Number>
    <Name>Socks</Name>
    <SinglePrice>2.30</SinglePrice>
  </Article>
  <Article>
    <Number>3</Number>
    <Name>Pants</Name>
    <SinglePrice>34</SinglePrice>
  </Article>
  <Article>
    <Number>4</Number>
    <Name>Jacket</Name>
    <SinglePrice>57.50</SinglePrice>
  </Article>
</Articles>

Articles.xml

例えば、「孫」 要素名 (Number、Name、SinglePrice) を取得するには、2番目の element() ノードの下の local-name() ノードからターゲットノードに接続を描きます。同様に、 「孫」 要素の値 (1、T-Shirt、25) を取得するには、 text() ノードから接続を描きます。

 

この例には適用することはできませんが、実際のシナリオでは、更に深いレベルにアクセスするために、動的なノード名を後の xs:anyType ノードに対して有効化することができます。

 

以下の点に注意してください:

 

btn_derived_type ボタンを使用して、生成された型を現在のスキーマから選択し、異なるノード内に表示することができます。この方法は、生成されたスキーマの型から、または、スキーマの型へマップする必要がある場合のみに役に立ちます (次を参照してください: 生成された XML スキーマ型)。
element() ノードの横の「選択の変更」 ( mf_ic_change_selection ) ボタンは、このトピックで説明されている「動的に名前の付けられた子の設定」ダイアログボックスを開きます。
xs:anyAttribute 属性の横の「選択の変更」 ( mf_ic_change_selection ) ボタンにより、スキーマ内でグローバルに定義された属性を選択することができます。同様に、 xs:any 要素の横の「選択の変更」 ( mf_ic_change_selection ) によりスキーマ内でグローバルに定義されている要素を選択することができます。これにより、スキーマワイルドカードへ、または、スキーマワイルドカードからのマッピングと同じように動作します (次も参照してください: ワイルドカード - xs:any / xs:anyAttribute)。このオプションを使用する場合、選択された属性または要素がスキーマに従い特定のレベルで存在できることを確認してください。

(C) 2019 Altova GmbH