前のページ|次のページ

データの連結を避けるために、オブザベーションの境界を決定する

次の例では、XMLドキュメントをインポートする際に、連結されたデータではなく独立したオブザベーションが生成されるようにオブザベーション境界を決定する方法を示します。
オブザベーション境界は、一定の個数の列を伴う任意の個数の行の集合(すなわち表)に変換されます。XMLMapを使用する場合、オブザベーション境界を決定するには、TABLE-PATH要素で場所パスを指定します。この場所パスの終了タグにより、どの時点でデータが1つのオブザベーションとしてSASデータセットに書き出されるかが決定されます。
開始タグと終了タグのペアリングシーケンスが原因で、オブザベーション境界の特定が困難になる場合があります。適切なオブザベーション境界を特定しない場合、結果として独立したオブザベーションではなく、連結されたデータ文字列が生成されることがあります。次の例では、望ましくない結果を引き起こすペアリング状況を示します。
次のXMLドキュメントを正しくインポートするには、XMLMapが必要となります。XMLMapを使用しない場合、XML Engineは同XMLドキュメントをインポートした結果、Row0、Model0、Year0、Row1、Model1、Year1のような変数を含む、FORDという名前のデータセットを1つ生成します。
<?xml version="1.0" ?>
<VEHICLES>
  <FORD>
    <ROW>
      <Model>Mustang</Model>
      <Year>1965</Year>
    </ROW>
    <ROW>
      <Model>Explorer</Model>
      <Year>1982</Year>
    </ROW>
    <ROW>
      <Model>Taurus</Model>
      <Year>1998</Year>
    </ROW>
    <ROW>
      <Model>F150</Model>
      <Year>2000</Year>
    </ROW>
  </FORD>
</VEHICLES>
前述のXMLドキュメントを調べると、開始タグと終了タグからなる要素のシーケンスが3つ存在することが分かります。すなわち、VEHICLES、FORD、ROWです。表の場所パスと列の場所パスを次のように指定した場合、XML EngineはこのXMLドキュメントを次のように処理します。
<TABLE-PATH syntax="XPath"> /VEHICLES/FORD </TABLE-PATH>
  <PATH syntax="XPath"> /VEHICLES/FORD/ROW/Model </PATH>
  <PATH syntax="XPath"> /VEHICLES/FORD/ROW/Year </PATH>
  1. XML Engineは、開始タグ<FORD>を検出するまで、XMLマークアップを読み込みます。これは、FORDが表の場所パスの最後の要素として指定されているためです。
  2. XML Engineは入力バッファをクリアし、列の場所パスに基づいて、後続の要素を変数用にスキャンします。各変数の値を検出すると、その値が入力バッファに読み込まれます。たとえば、最初のROW要素を読み込んだ後、入力バッファには値Mustangおよび1965が含まれています。
  3. XML Engineは、終了タグ</FORD>を検出するまで、入力バッファへの値の読み込みを続行します。同終了タグを検出した時点で、XML Engineは、完了した入力バッファを1つのオブザベーションとしてSASデータセットに書き出します。
  4. この結果、1つのオブザベーションのみが書き出されます。これは望ましい結果ではありません。
連結されていない、独立したオブザベーションを生成するには、XML Engineが独立したオブザベーションをSASデータセットに書き出すように表の場所パスを変更する必要があります。正しい場所パスと、それに従ってXML Engineが実施する処理を次に示します。
<TABLE-PATH syntax="XPath"> /VEHICLES/FORD/ROW </TABLE-PATH>
  <PATH syntax="XPath"> /VEHICLES/FORD/ROW/Model </PATH>
  <PATH syntax="XPath"> /VEHICLES/FORD/ROW/Year </PATH>
  1. XML Engineは、開始タグ<ROW>を検出するまで、XMLマークアップを読み込みます。これは、ROWが表の場所パスの最後の要素として指定されているためです。
  2. XML Engineは入力バッファをクリアし、列の場所パスに基づいて、後続の要素を変数用にスキャンします。各変数の値を検出すると、その値が入力バッファに読み込まれます。
  3. XML Engineは、終了タグ</ROW>を検出するまで、入力バッファへの値の読み込みを続行します。同終了タグを検出した時点で、XML Engineは、完了した入力バッファを1つのオブザベーションとしてSASデータセットに書き出します。すなわち、値Mustangおよび1965を含む1つのオブザベーションがSASデータセットに書き出されます。
  4. 開始タグ<ROW>と終了タグ</ROW>のシーケンスを検出するたびに、前述の処理が繰り返されます。
  5. 結果として、4つのオブザベーションが生成されます。
完全なXMLMap構文の内容は次のとおりです。
<?xml version="1.0" ?>
<SXLEMAP version="2.1" name="path" description="XMLMap for path">
  <TABLE name="FORD">
    <TABLE-PATH syntax="XPath"> /VEHICLES/FORD/ROW </TABLE-PATH>
    <COLUMN name="Model">
      <DATATYPE> string </DATATYPE>
      <LENGTH> 20 </LENGTH>
      <TYPE> character </TYPE>
      <PATH syntax="XPath"> /VEHICLES/FORD/ROW/Model </PATH>
    </COLUMN>
    <COLUMN name="Year">
      <DATATYPE> string </DATATYPE>
      <LENGTH> 4 </LENGTH>
      <TYPE> character </TYPE>
      <PATH syntax="XPath"> /VEHICLES/FORD/ROW/Year </PATH>
    </COLUMN>
  </TABLE>
</SXLEMAP>
次のSASステートメントは、XMLドキュメントをインポートして、XMLMapを指定します。その後、PRINTプロシジャによりインポート結果を検証します。
filename path 'C:\My Documents\XML\path.xml';
filename map 'C:\My Documents\XML\path.map';

libname path xmlv2 xmlmap=map;

proc print data=path.ford noobs;
run;
PATH.FORDデータセットを表示するPRINTプロシジャ出力
PATH.FORDデータセットを表示するPRINTプロシジャ出力
前のページ|次のページ|ページの先頭へ